FineReport报表二次开发详细.docx
- 文档编号:24349779
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:33
- 大小:26.98KB
FineReport报表二次开发详细.docx
《FineReport报表二次开发详细.docx》由会员分享,可在线阅读,更多相关《FineReport报表二次开发详细.docx(33页珍藏版)》请在冰豆网上搜索。
FineReport报表二次开发详细
FineReport报表二次开发
在大多数情况下FineReport都可以完全满足用户制作各种报表的需求,但是为了能够满足个别用户的个性化需求,FineReport提供了丰富二次开发接口,方便用户将FineReport和自己的项目实现无缝结合,用户在进行二次开发的工程中可以更加深入的体会到FineReport工具的强大功能。
例如:
在一些特殊领域,可能需要一些特殊的函数。
或者要将某个模板文件通过指定的打印机打印等等。
Report的输入输出…………………………………………………………3
单元格格式设置………………………………………………………………7
将模板通过指定打印机打印…………………………………………………10
自定义函数……………………………………………………………………12
URL传递参数………………………………………………………………22
向报表中添加单元格…………………………………………………………25
读取单元格内容………………………………………………………………29
创建程序网络模版……………………………………………………………32
读取模板报表…………………………………………………………………36
Report的输入输出
∙读取模板文件
∙保存成模板文件
∙输出成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。
package
import
import
import
import
import
import
import
import
import
import
import
import
/**
*演示如何导入导出模板
*@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);
parameterMap=new
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中的方法进一步地设置该单元格的各种属性。
可执行代码如下:
package
importjava.awt.Color;
import
import
import
import
import
import
import
import
import
import
import
import
/**
*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");
可执行代码
package
import
import
import
import
/**
*演示如何将模板通过指定打印机打印
*
*@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.
*/
package
import
importcom.fr.
import
/**
*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(objinstanceofBoolean){ return((Boolean)obj).booleanValue()? 1: 0; }elseif(objinstanceofFArray){ FArrayarray=(FArray)obj; doublesum=0; for(inti=0,len=array.length();i sum+=parseObject(array.elementAt(i)); } returnsum; }elseif(obj! =null){ try{ returnDouble.parseDouble(obj.toString()); }catch(NumberFormatExceptionexp){ return0; } } return0; } publicStringgetCN(){ return"SUM(number1,number2,…): 求一个指定单元格区域中所有数字之和。 \n" +"Number1,number2,…: 1到30个参数或指定单元格区域中所有数字。 \n" +"备注: \n" +"函数将直接键入参数中的数值、逻辑值及文本表达式计算在内。 \n" +"若参数是数组或引用,则只有数组或单元格引用中的数值进行计算。 \n" +"示例: \n" +"SUM(70,80)等于150。 \n" +"SUM(\"70\",80,TRUE)等于151,逻辑值“TRUE”作为1来计算;“FALSE”作为0计算;文本“70”作为70来计算。 "; } publicStringgetEN(){ return"SUM(number1,number2,…): Addsallthenumbersinarangeofcells.\n" +"Number1,number2,...are1to30argumentsforwhichyouwantthetotalvalueorsum.\n" +"\n" +"Remarks: \n" +"1.Numbers,logicalvalues,andtextrepresentationsofnumbersthatyoutypedirectlyintothelistofargumentsarecounted.Seethefirstandsecondexamplesfollowing.\n" +"2.Ifanargumentisanarrayorreference,onlynumbersinthatarrayorreferencearecounted.Emptycells,logicalvalues,text,orerrorvaluesinthearrayorreferenceareignored.Seethethirdexamplefollowing.\n" +"\n" +"Example: \n" +"SUM(70,80)=150.\n" +"SUM(\"70\",80,TRUE)=151,TRUEiscalculatedas1,FALSEfor0,String\"70\"fo70."; } }SUM类用来运算SUM函数,它继承了AbstractFunction这个类,而AbstractFunction实现了Function这个接口,在函数元算的时候首先根据函数名取得运算这个函数的类,比如SUM(2,4,true)这个函数首先根据函数名SUM取得SUM这个类,然后调用SUM类的run(Object[]agrs)方法,agrs中存放的是SUM函数的参数,在运算的时候可以从args中取得参数进行运算。 自定义函数步骤 下面以一个自定义函数的例子来说明如何使用自定义函数,我们定义一个函数FunctionDemo,它的功能是填报数据校验的时候,某个单元格的值希望与数据库中的某个值进行比较。 实现FunctionDemo.java 编译FunctionDemo.java 注册函数FunctionDemo 使用函数FunctionDemo 实现FunctionDemo.java 代码如下: package import import importj import import import
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FineReport 报表 二次开发 详细