FineReport报表二次开发详细.docx
《FineReport报表二次开发详细.docx》由会员分享,可在线阅读,更多相关《FineReport报表二次开发详细.docx(41页珍藏版)》请在冰豆网上搜索。
FineReport报表二次开发详细
FineReport报表二次开发
在大多数情况下FineReport都可以完全满足用户制作各种报表的需求,但是为了能够满足个别用户的个性化需求,FineReport提供了丰富二次开发接口,方便用户将FineReport和自己的项目实现无缝结合,用户在进行二次开发的工程中可以更加深入的体会到FineReport工具的强大功能。
例如:
在一些特殊领域,可能需要一些特殊的函数。
或者要将某个模板文件通过指定的打印机打印等等。
Report的输入输出…………………………………………………………3
单元格格式设置………………………………………………………………7
将模板通过指定打印机打印…………………………………………………10
自定义函数……………………………………………………………………12
URL传递参数………………………………………………………………22
向报表中添加单元格…………………………………………………………25
读取单元格内容………………………………………………………………29
创建程序网络模版……………………………………………………………32
读取模板报表…………………………………………………………………36
Report的输入输出
FineReport提供了强大的输入输出功能,所有的这些输入输出的类都在com.fr.report.io包里面。
Report的输入指从报表的模板文件(XML格式的)创建Report对象,输出指将Report保存为模板文件,FineReport还支持将Report保存为PDF,Excel,Word,SVG,HTML,CSV等文件格式。
读取模板文件
保存成模板文件
输出成PDF文件
输出成Word文件
输出成Excel文件
输出成文本文件
可执行代码
读取模板文件
//读取模板
FilecptFile=newFile("D:
\\stuff.cpt");
TemplateImportertemplateImporter=newTemplateImporter();WorkBookworkBook=(WorkBook)templateImporter.generate(cptFile);
Stuff.cpt是用报表设计器生成的模板文件。
只需要用建立一个TemplateImporter对象,然后调用它的generateReport()方法来产生一个Report对象,同时可以将产生的Report对象强制转换成WorkSheet或者GroupReport。
保存成模板文件
//CPT
//清空公式计算结果
E:
\\newtemplate\\stuff.cpt这个是导出后新文档生成的地址
ReportHelper.clearFormulaResult(workBook);
outputStream=newFileOutputStream(newFile("E:
\\newtemplate\\stuff.cpt"));
TemplateExportertemplateExporter=newTemplateExporter();
templateExporter.export(outputStream,workBook.execute(parameterMap));
通过调用TemplateExporter的exportReport(...)方法,可以把Report对象以CPT格式保存到外部磁盘文件当中。
可执行代码
读取报表模板stuff.cpt,再分别保存为stuff.cpt,stuff.pdf和stuff.xls。
packagecom.fr.demo;
importjava.io.File;
importjava.io.FileOutputStream;
importcom.fr.base.FRContext;
importcom.fr.base.dav.LocalEnv;
importcom.fr.report.WorkBook;
importcom.fr.report.core.ReportHelper;
importcom.fr.report.io.ExcelExporter;
importcom.fr.report.io.PDFExporter;
importcom.fr.report.io.TemplateExporter;
importcom.fr.report.io.TemplateImporter;
importcom.fr.report.io.TextExporter;
importcom.fr.report.io.WordExporter;
/**
*演示如何导入导出模板
*@authoredgarduan
*@version6.5
*/
publicclassReportIO{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//报表运行环境路径,WEB-INF目录所放的位置
StringenvPath="C:
/FineReport6.5/WebReport/WEB-INF";
//设置当前报表运行环境,报表预览时需要一个运行环境
//没有WEB-INF目录时,路径设置为null.FRContext.setCurrentEnv(newLocalEnv(null));
FRContext.setCurrentEnv(newLocalEnv(envPath));
try{
//读取模板
FilecptFile=newFile("D:
\\stuff.cpt");
TemplateImportertemplateImporter=newTemplateImporter();
WorkBookworkBook=(WorkBook)templateImporter.generate(cptFile);
java.util.MapparameterMap=newjava.util.HashMap();
FileOutputStreamoutputStream;
//生成CPT
//清空公式计算结果
ReportHelper.clearFormulaResult(workBook);
outputStream=newFileOutputStream(newFile("E:
\\newtemplate\\stuff.cpt"));
TemplateExportertemplateExporter=newTemplateExporter();
templateExporter.export(outputStream,workBook.execute(parameterMap));
//生成PDF
ReportHelper.clearFormulaResult(workBook);
outputStream=newFileOutputStream(newFile("E:
\\newtemplate\\stuff.pdf"));
PDFExporterpdfExporter=newPDFExporter();
pdfExporter.export(outputStream,workBook.execute(parameterMap));
//生成DOC
ReportHelper.clearFormulaResult(workBook);
outputStream=newFileOutputStream(newFile("E:
\\newtemplate\\stuff.doc"));
WordExporterwordExporter=newWordExporter();
wordExporter.export(outputStream,workBook.execute(parameterMap));
//生成XLS
ReportHelper.clearFormulaResult(workBook);
outputStream=newFileOutputStream(newFile("E:
\\newtemplate\\stuff.xls"));
ExcelExporterexcelExporter=newExcelExporter();
excelExporter.export(outputStream,workBook.execute(parameterMap));
//生成TXT
ReportHelper.clearFormulaResult(workBook);
outputStream=newFileOutputStream(newFile("E:
\\newtemplate\\stuff.txt"));
TextExportertextExporter=newTextExporter();textExporter.export(outputStream,workBook.execute(parameterMap));
}catch(Exceptione){
e.printStackTrace();
}
}
}
单元格格式设置
// 新建一个单元格, 位置为(2, 2), 列宽为2
// 行高为 2, 值为文本 "FineReport"
CellElement cellElement = new CellElement(2, 2, 2, 2, "FineReport");
// 得到CellElement的样式,如果没有新建默认样式
Style style = cellElement.getStyle();
if(style == null) {
style = Style.getInstance();
}
// 设置字体和前景的颜色
FRFont frFont = FRFont.getInstance("Dialog", Font.BOLD, 14);
frFont = frFont.applyForeground(new Color(21, 76, 160));
style = style.deriveFRFont(frFont);
// 设置背景
ColorBackground background = ColorBackground.getInstance(new Color(255, 255, 177));
style = style.deriveBackground(background);
// 设置水平居中
style = style.deriveHorizontalAlignment(Constants.CENTER);
// 设置边框
style = style.deriveBorder(Constants.LINE_DASH_DOT, Color.red, Constants.LINE_DASH_DOT, Color.yellow, Constants.LINE_DASH_DOT, Color.BLUE, Constants.LINE_DASH_DOT, Color.CYAN);
// 改变单元格的样式
cellElement.setStyle(style);
改变单元格的格式,应先取出该单元格(CellElement)的格式(Style)。
在默认的情况下Style是null,故当取出Style后应先判断其值是否为null,如果这个值为空,则需先新建一个Style,然后再将该值赋给CellElement。
最后根据Style和FRFont中的方法进一步地设置该单元格的各种属性。
可执行代码如下:
packagecom.fr.demo;
importjava.awt.Color;
importjava.awt.Font;
importcom.fr.base.Constants;
importcom.fr.base.FRFont;
importcom.fr.base.Style;
importcom.fr.base.background.ColorBackground;
importcom.fr.report.CellElement;
importcom.fr.report.DefaultCellElement;
importcom.fr.report.WorkBook;
importcom.fr.report.WorkBookTemplate;
importcom.fr.report.WorkSheet;
importcom.fr.web.Reportlet;
importcom.fr.web.ReportletRequest;
/**
*ReportletFromTemplateDemo.
*@authormarks
*设置单元格格式
*/
publicclassCellElementStyleDemoimplementsReportlet{
publicCellElementStyleDemo(){
}
//建立新报表需要传参(ReportletRequestreportletRequest)
publicWorkBookTemplatecreateReport(ReportletRequestreportletRequest){
//newaWorkSheet
WorkBookwb=newWorkBook();
WorkSheetworkSheet=newWorkSheet();
//newacellElementwithString"FineReport"
CellElementcellElement1=newDefaultCellElement(1,1,"FineReport");
//addthecellElementtotheworkSheet
workSheet.addCellElement(cellElement1);
//setthecolumnWidthof1to200px,rowHeightof1to30px
workSheet.setColumnWidth(1,200);
workSheet.setRowHeight(1,30);
//setthefontofcellElement1
Stylestyle=Style.getInstance();
FRFontfrFont=FRFont.getInstance("Tahoma",Font.BOLD|Font.ITALIC,20);
frFont=frFont.applyForeground(Color.red);
style=style.deriveFRFont(frFont);
//设置背景
ColorBackgroundbackground=ColorBackground.getInstance(newColor(255,255,177));
style=style.deriveBackground(background);
//设置水平居中
style=style.deriveHorizontalAlignment(Constants.CENTER);
//设置边框
style=style.deriveBorder(Constants.LINE_DASH_DOT,Color.red,Constants.LINE_DASH_DOT,Color.yellow,Constants.LINE_DASH_DOT,Color.BLUE,Constants.LINE_DASH_DOT,Color.CYAN);
cellElement1.setStyle(style);
//setthecolumnWidthof4to200px,rowHeightof5to50px
workSheet.setColumnWidth(4,200);
wb.addReport(workSheet);
returnwb;
}
}
结果如下图所示:
将模板通过指定打印机打印
用户在使用FineReport进行二次开发的过程中有时候需要对不同文件通过不同的打印机打印出来,比如A打印机只能打印A.TXT;B打印机只能打印b.txt.。
得到当前报表运行环境
StringenvPath="C:
/FineReport6.5/WebReport/WEB-INF";
//设置当前报表运行环境,报表预览时需要一个运行环境
//没有WEB-INF目录时,路径设置为null.FRContext.setCurrentEnv(newLocalEnv(null));
FRContext.setCurrentEnv(newLocalEnv(envPath));
读取模板文件
//读取模板
WorkBookTemplatewbTpl=FRContext.getCurrentEnv().readTemplate("stuff.cpt");
指定打印机打印
PrintUtils.print(wbTpl.execute(null).generateReportPageSet().getTraversingCase(),false,"SmartPrint");
可执行代码
packagecom.fr.demo;
importcom.fr.base.FRContext;
importcom.fr.base.dav.LocalEnv;
importcom.fr.base.print.PrintUtils;
importcom.fr.report.WorkBookTemplate;
/**
*演示如何将模板通过指定打印机打印
*
*@authoredgarduan
*@version6.5
*/
publicclassPrintDemo{
publicstaticvoidmain(String[]args){
//报表运行环境路径,WEB-INF目录所放的位置
StringenvPath="C:
/FineReport6.5/WebReport/WEB-INF";
//设置当前报表运行环境,报表预览时需要一个运行环境
//没有WEB-INF目录时,路径设置为null.FRContext.setCurrentEnv(newLocalEnv(null));
FRContext.setCurrentEnv(newLocalEnv(envPath));
try{
WorkBookTemplatewbTpl=FRContext.getCurrentEnv().readTemplate("stuff.cpt");
//null为模板需要传的参数,false为是否弹出提示窗口,SmartPrint为打印机名称PrintUtils.print(wbTpl.execute(null).generateReportPageSet().getTraversingCase(),false,"SmartPrint");
}catch(Exceptione){
e.printStackTrace();
}
}
}
自定义函数
FineReport已经提供了大量的自带函数,在正常情况下足够满足用户的报表制作需求,但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,FineReport提供了自定义函数机制,可以由用户根据业务需要自己来定义一些函数,但这些函数必须满足FineReport函数定义规则。
FineReport函数定义规则:
Functionname(Para,Para,...),其中Functionname为函数名,Para为参数。
函数原理
在FineReport中,每一个函数都被定义成一个类,这个类必须要实现Function这个接口,在运算的时候首先通过函数名反射取得这个类,然后调用它的run(Object[]agrs)方法。
下面以SUM这个函数为例。
/*
*Copyright(c)2001-2008,FineReportInc,AllRightsReserved.
*/
packagecom.fr.report.script.function;
importcom.fr.report.script.NormalFunction;
importcom.fr.report.script.core.FArray;
importcom.fr.report.script.core.FunctionHelper;
/**
*Function.
*/
publicclassSUMextendsNormalFunction{
/**
*Runthefunctiononthestack.Popstheargumentsfromthestack,
*thenreturntheresult.
*/
publicObjectrun(Object[]args){
doubleresult=0;
for(inti=0;i//p:
需要先判断是否为null.
if(args[i]==null){
continue;
}
result+=parseObject(args[i]);
}
returnFunctionHelper.parsePrimitiveDouble(result);
}
/*
*把Object转成double类型的值
*/
privatedoubleparseObject(Objectobj){
if(objinstanceofNumber){
return((Number)obj).doubleValue();
}elseif(objinstance