1、FineReport报表二次开发详细 FineReport报表二次开发在大多数情况下FineReport都可以完全满足用户制作各种报表的需求,但是为了能够满足个别用户的个性化需求,FineReport提供了丰富二次开发接口,方便用户将FineReport和自己的项目实现无缝结合,用户在进行二次开发的工程中可以更加深入的体会到FineReport工具的强大功能。例如:在一些特殊领域,可能需要一些特殊的函数。或者要将某个模板文件通过指定的打印机打印等等。Report的输入输出 3单元格格式设置 7将模板通过指定打印机打印 10自定义函数 12URL 传递参数 22向报表中添加单元格25读取单元格内
2、容29创建程序网络模版32读取模板报表36Report的输入输出FineReport提供了强大的输入输出功能,所有的这些输入输出的类都在com.fr.report.io包里面。Report的输入指从报表的模板文件(XML格式的)创建Report对象,输出指将Report保存为模板文件,FineReport还支持将Report保存为PDF,Excel,Word,SVG,HTML,CSV等文件格式。 读取模板文件 保存成模板文件 输出成PDF文件 输出成Word文件 输出成Excel文件 输出成文本文件 可执行代码 读取模板文件 / 读取模板 File cptFile = new File(D:s
3、tuff.cpt); TemplateImporter templateImporter = new TemplateImporter(); WorkBook workBook = (WorkBook)templateImporter.generate(cptFile); Stuff.cpt是用报表设计器生成的模板文件。只需要用建立一个TemplateImporter对象, 然后调用它的generateReport()方法来产生一个Report对象,同时可以将产生的Report对象强制转换成WorkSheet或者GroupReport。保存成模板文件/ CPT / 清空公式计算结果 E:new
4、templatestuff.cpt这个是导出后新文档生成的地址 ReportHelper.clearFormulaResult(workBook); outputStream = new FileOutputStream(new File(E:newtemplatestuff.cpt); TemplateExporter templateExporter = new TemplateExporter(); templateExporter.export(outputStream,workBook.execute(parameterMap) ;通过调用TemplateExporter的expor
5、tReport(.)方法, 可以把Report对象以CPT格式保存到外部磁盘文件当中。可执行代码读取报表模板stuff.cpt,再分别保存为stuff.cpt,stuff.pdf和stuff.xls。package com.fr.demo; import java.io.File; import java.io.FileOutputStream; import com.fr.base.FRContext; import com.fr.base.dav.LocalEnv; import com.fr.report.WorkBook; import com.fr.report.core.Repor
6、tHelper; import com.fr.report.io.ExcelExporter; import com.fr.report.io.PDFExporter; import com.fr.report.io.TemplateExporter; import com.fr.report.io.TemplateImporter; import com.fr.report.io.TextExporter; import com.fr.report.io.WordExporter; /* * 演示如何导入导出模板 * author edgar duan * version 6.5 */ pu
7、blic class ReportIO /* * param args */ public static void main(String args) / 报表运行环境路径, WEB-INF目录所放的位置 String envPath = C:/FineReport6.5/WebReport/WEB-INF; / 设置当前报表运行环境, 报表预览时需要一个运行环境 / 没有WEB-INF目录时, 路径设置为null. FRContext.setCurrentEnv(new LocalEnv(null); FRContext.setCurrentEnv(new LocalEnv(envPath)
8、; try / 读取模板 File cptFile = new File(D:stuff.cpt); TemplateImporter templateImporter = new TemplateImporter(); WorkBook workBook = (WorkBook)templateImporter.generate(cptFile); java.util.Map parameterMap = new java.util.HashMap(); FileOutputStream outputStream; /生成 CPT / 清空公式计算结果 ReportHelper.clearF
9、ormulaResult(workBook); outputStream = new FileOutputStream(new File(E:newtemplatestuff.cpt); TemplateExporter templateExporter = new TemplateExporter(); templateExporter.export(outputStream, workBook.execute(parameterMap) ; /生成 PDF ReportHelper.clearFormulaResult(workBook); outputStream = new FileO
10、utputStream(new File(E:newtemplatestuff.pdf); PDFExporter pdfExporter = new PDFExporter(); pdfExporter.export(outputStream, workBook.execute(parameterMap) ; / 生成DOC ReportHelper.clearFormulaResult(workBook); outputStream = new FileOutputStream(new File(E:newtemplatestuff.doc); WordExporter wordExpor
11、ter = new WordExporter(); wordExporter.export(outputStream,workBook.execute(parameterMap); / 生成XLS ReportHelper.clearFormulaResult(workBook); outputStream = new FileOutputStream(new File(E:newtemplatestuff.xls); ExcelExporter excelExporter = new ExcelExporter(); excelExporter.export(outputStream,wor
12、kBook.execute(parameterMap); /生成 TXT ReportHelper.clearFormulaResult(workBook); outputStream = new FileOutputStream(new File(E:newtemplatestuff.txt); TextExporter textExporter = new TextExporter(); textExporter.export(outputStream,workBook.execute(parameterMap); catch(Exception e) e.printStackTrace(
13、); 单元格格式设置/新建一个单元格,位置为(2,2),列宽为2 /行高为2,值为文本FineReport CellElementcellElement=newCellElement(2,2,2,2,FineReport); /得到CellElement的样式,如果没有新建默认样式 Stylestyle=cellElement.getStyle(); if(style=null) style=Style.getInstance(); /设置字体和前景的颜色 FRFontfrFont=FRFont.getInstance(Dialog,Font.BOLD,14); frFont=frFont.a
14、pplyForeground(newColor(21,76,160); style=style.deriveFRFont(frFont); /设置背景 ColorBackgroundbackground=ColorBackground.getInstance(newColor(255,255,177); style=style.deriveBackground(background); /设置水平居中 style=style.deriveHorizontalAlignment(Constants.CENTER); /设置边框 style=style.deriveBorder(Constants
15、.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。最后根
16、据Style和FRFont中的方法进一步地设置该单元格的各种属性。可执行代码如下:package com.fr.demo; import java.awt.Color; import java.awt.Font; import com.fr.base.Constants;import com.fr.base.FRFont; import com.fr.base.Style; import com.fr.base.background.ColorBackground;import com.fr.report.CellElement; import com.fr.report.DefaultCel
17、lElement; import com.fr.report.WorkBook;import com.fr.report.WorkBookTemplate;import com.fr.report.WorkSheet; import com.fr.web.Reportlet; import com.fr.web.ReportletRequest; /* * ReportletFromTemplateDemo. * author marks * 设置单元格格式 */ public class CellElementStyleDemo implements Reportlet public Cel
18、lElementStyleDemo() /建立新报表需要传参(ReportletRequest reportletRequest) public WorkBookTemplate createReport(ReportletRequest reportletRequest) /new a WorkSheet WorkBook wb = new WorkBook(); WorkSheet workSheet = new WorkSheet(); /new a cellElement with String FineReport CellElement cellElement1 = new Def
19、aultCellElement(1, 1, FineReport); /add the cellElement to the workSheet workSheet.addCellElement(cellElement1); /set the columnWidth of 1 to 200px,rowHeight of 1 to 30px workSheet.setColumnWidth(1, 200); workSheet.setRowHeight(1, 30); /set the font of cellElement1 Style style = Style.getInstance();
20、 FRFont frFont = FRFont.getInstance(Tahoma, Font.BOLD | Font.ITALIC, 20); frFont = frFont.applyForeground(Color.red); style = style.deriveFRFont(frFont); / 设置背景 ColorBackground background = ColorBackground.getInstance(new Color(255, 255, 177); style = style.deriveBackground(background); / 设置水平居中 sty
21、le = 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); /set the columnWidth of 4 to 2
22、00px,rowHeight of 5 to 50px workSheet.setColumnWidth(4, 200); wb.addReport(workSheet); return wb; 结果如下图所示:将模板通过指定打印机打印用户在使用FineReport进行二次开发的过程中有时候需要对不同文件通过不同的打印机打印出来,比如A打印机只能打印A.TXT; B打印机只能打印b.txt.。得到当前报表运行环境 String envPath = C:/FineReport6.5/WebReport/WEB-INF; / 设置当前报表运行环境, 报表预览时需要一个运行环境 / 没有WEB-IN
23、F目录时, 路径设置为null. FRContext.setCurrentEnv(new LocalEnv(null); FRContext.setCurrentEnv(new LocalEnv(envPath); 读取模板文件 / 读取模板 WorkBookTemplate wbTpl = FRContext.getCurrentEnv().readTemplate(stuff.cpt); 指定打印机打印PrintUtils.print(wbTpl.execute(null).generateReportPageSet().getTraversingCase(), false, Smart
24、Print); 可执行代码package com.fr.demo;import com.fr.base.FRContext;import com.fr.base.dav.LocalEnv;import com.fr.base.print.PrintUtils;import com.fr.report.WorkBookTemplate;/* * 演示如何将模板通过指定打印机打印 * * author edgar duan * version 6.5 */public class PrintDemo public static void main(String args) / 报表运行环境路径,
25、WEB-INF目录所放的位置 String envPath = C:/FineReport6.5/WebReport/WEB-INF; / 设置当前报表运行环境, 报表预览时需要一个运行环境 / 没有WEB-INF目录时, 路径设置为null. FRContext.setCurrentEnv(new LocalEnv(null); FRContext.setCurrentEnv(new LocalEnv(envPath); try WorkBookTemplate wbTpl = FRContext.getCurrentEnv().readTemplate(stuff.cpt); /null
26、为模板需要传的参数,false为是否弹出提示窗口,Smart Print 为打印机名称 PrintUtils.print(wbTpl.execute(null).generateReportPageSet().getTraversingCase(), false, Smart Print); catch(Exception e) e.printStackTrace(); 自定义函数FineReport已经提供了大量的自带函数,在正常情况下足够满足用户的报表制作需求,但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,FineReport提供了自定义函数机制,可以由用户根据业务需要自己来定
27、义一些函数,但这些函数必须满足FineReport函数定义规则。 FineReport函数定义规则:Functionname(Para,Para,.),其中Functionname为函数名,Para为参数。 函数原理在FineReport中,每一个函数都被定义成一个类,这个类必须要实现Function这个接口,在运算的时候首先通过函数名反射取得这个类,然后调用它的run(Object agrs)方法。下面以SUM这个函数为例。 /* * Copyright(c) 2001-2008, FineReport Inc, All Rights Reserved. */package com.fr.r
28、eport.script.function;import com.fr.report.script.NormalFunction;import com.fr.report.script.core.FArray;import com.fr.report.script.core.FunctionHelper;/* * Function. */public class SUM extends NormalFunction /* * Run the function on the stack. Pops the arguments from the stack, * then return the r
29、esult. */ public Object run(Object args) double result = 0; for(int i = 0; i args.length; i+) /p:需要先判断是否为null. if(argsi = null) continue; result += parseObject(argsi); return FunctionHelper.parsePrimitiveDouble(result); /* * 把Object转成double类型的值 */ private double parseObject(Object obj) if (obj instanceof Number) return (Number)obj).doubleValue(); else if (obj instance
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1