已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FineReport报表二次开发在大多数情况下FineReport都可以完全满足用户制作各种报表的需求,但是为了能够满足个别用户的个性化需求,FineReport提供了丰富二次开发接口,方便用户将FineReport和自己的项目实现无缝结合,用户在进行二次开发的工程中可以更加深入的体会到FineReport工具的强大功能。例如:在一些特殊领域,可能需要一些特殊的函数。或者要将某个模板文件通过指定的打印机打印等等。目录Report的输入输出 3单元格格式设置 7将模板通过指定打印机打印 10自定义函数 12URL 传递参数 22向报表中添加单元格25读取单元格内容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:stuff.cpt); TemplateImporter templateImporter = new TemplateImporter(); WorkBook workBook = (WorkBook)templateImporter.generate(cptFile); Stuff.cpt是用报表设计器生成的模板文件。只需要用建立一个TemplateImporter对象, 然后调用它的generateReport()方法来产生一个Report对象,同时可以将产生的Report对象强制转换成WorkSheet或者GroupReport。保存成模板文件/ CPT / 清空公式计算结果 E:newtemplatestuff.cpt这个是导出后新文档生成的地址 ReportHelper.clearFormulaResult(workBook); outputStream = new FileOutputStream(new File(E:newtemplatestuff.cpt); TemplateExporter templateExporter = new TemplateExporter(); templateExporter.export(outputStream,workBook.execute(parameterMap) ;通过调用TemplateExporter的exportReport(.)方法, 可以把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.ReportHelper; 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 */ public 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); 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.clearFormulaResult(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 FileOutputStream(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 wordExporter = 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,workBook.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(); 单元格格式设置/新建一个单元格,位置为(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.applyForeground(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.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 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.DefaultCellElement; 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 CellElementStyleDemo() /建立新报表需要传参(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 DefaultCellElement(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(); 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); / 设置水平居中 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); /set the columnWidth of 4 to 200px,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-INF目录时, 路径设置为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 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) / 报表运行环境路径, 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 为模板需要传的参数,false为是否弹出提示窗口,Smart Print 为打印机名称 PrintUtils.print(wbTpl.execute(null).generateReportPageSet().getTraversingCase(), false, Smart Print); catch(Exception e) e.printStackTrace(); 自定义函数FineReport已经提供了大量的自带函数,在正常情况下足够满足用户的报表制作需求,但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,FineReport提供了自定义函数机制,可以由用户根据业务需要自己来定义一些函数,但这些函数必须满足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.report.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 result. */ 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 instanceof Boolean) return (Boolean)obj).booleanValue() ? 1 : 0; else if (obj instanceof FArray) FArray array = (FArray)obj; double sum = 0; for(int i = 0, len = array.length(); i len; i+) sum += parseObject(array.elementAt(i); return sum; else if(obj != null) try return Double.parseDouble(obj.toString(); catch(NumberFormatException exp) return 0; return 0; public String getCN()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来计算。;public String getEN()return SUM(number1,number2,): Adds all the numbers in a range of cells.n+Number1, number2, . are 1 to 30 arguments for which you want the total value or sum.n+n+Remarks:n+1. Numbers, logical values, and text representations of numbers that you type directly into the list of arguments are counted. See the first and second examples following. n+2. If an argument is an array or reference, only numbers in that array or reference are counted. Empty cells, logical values, text, or error values in the array or reference are ignored. See the third example following. n+n+Example:n+ SUM(70,80)=150.n+ SUM(70,80,TRUE)=151, TRUE is calculated as 1, FALSE for 0, String 70 fo 70.;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 com.fr.demo;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.util.logging.Level;import com.fr.base.FRContext;import com.fr.base.dav.LocalEnv;import com.fr.base.file.DatasourceManager;import com.fr.data.impl.DatabaseConnection;import com.fr.report.script.NormalFunction;public class FunctionDemo extends NormalFunction /* * 此方法用于定义数据库连接 C:/FineReport6.5/WebReport/WEB-INF 是当前报表运行环境 * FRDemo 是当前的数据库连接名 * */public static Connection getConn() LocalEnv env = new LocalEnv(C:/FineReport6.5/WebReport/WEB-INF);FRContext.setCurrentEnv(env);try DatasourceManager datasourceManager = FRContext.getDatasourceManager();FRContext.getLogger().log(Level.WARNING, datasourceManager + );com.fr.data.impl.Connection dcon = datasourceManager.getConnection(FRDemo);if (dcon instanceof DatabaseConnection) return (DatabaseConnection) dcon).createConnection(); catch (Exception e) FRContext.getLogger().log(Level.WARNING, e.getMessage(), e);return null;public String getManageName() String resText = ;String selSQL = SELECT province FROM demo1 where number = 1;Connection con = getConn();try Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(selSQL);while (rs.next() resText = rs.getString(1);break;rs.close();con.close(); catch (Exception exp) try con.close(); catch (Exception exp2) return resText;public Object run(Object arg0) FRContext.getLogger().log(Level.WARNING, run);return this.getManageName();public String getCN() / TODO Auto-generated method stubreturn dsfhkds;public String getEN() / TODO Auto-generated method stubreturn null;注:demo1 表的内容如图:编译FunctionDemo.java 将编译后的FunctionDemo.class放到FineReport的安装目录WEB-INF下面的classes目录下,因为STRINGCAT.java属于包com.fr.demo,所以FunctionDemo.class需要放到classescomfrdemo目录下,全目录如下: %FineReport_HOME%WebReportWEB-INFclassescomfrdemo 注册FunctionDemo函数 需要在FineReport中注册这个函数才可以使用这个函数,首先打开服务器|函数管理器打开FineReport函数管理器,如下图所示: 点击按钮,系统自动添加一个函数名,你可以双击默认的函数名,清除以后自定义你所需要的函数名,如下所示: 在上图的描述输入框中,我们可以写入对该函数的函数明细。 在这里我们定义成FunctionDemo。然后再在右侧选择实现FunctionDemo函数的类FunctionDemo.class,如下图所示: 使用Funcation函数 打开一张报表,在这里通过定义报表参数来使用FunctionDemo函数。选择 报表-报表填报属性-数据校验- 这里定义的是将D3单元格的内容和函数返回值相比较,如果不一致则返回“ 请输入正确的地址”对报表进行填报预览:因为函数FunctionDemo返回值为北京,所以对第二行省份列报错。至此校验完成。URL传递参数的例子这个例子是要从URL中接收传递的参数,对报表模板进行参数值的修改。 步骤一:在设计器中新建一个自由报表的模板,在报表|报表参数中新建两个参数,命名为province ,country,如下图所示: 步骤二:新建实现了Reportlet的类URLParameterDemo 在createReport(ReportletRequest req)这个方法中需要从req中得到参数的值,并且用它来设置刚才建的模板中的参数值,首先要先得到模板的所有参数,然后取得这个参数,根据参数名在URL中取得参数的值,再用取得的值来设置模板中的参数,代码如下所示: 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.WorkBookTemplate;import com.fr.report.io.TemplateExporter;import com.fr.report.parameter.Parameter;/* * 模板传参 * author edgar duan * version 6.5 */ public class URLParameterDemo /* * 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); try WorkBookTemplate wbTpl = FRContext.getCurrentEnv().readTemplate(URLParameterDemo.cpt); java.util.Map parameterMap = new java.util.HashMap(); Parameter ps = wbTpl.getParameters(); for (int i = 0; i ps.length; i+) /向报表中传入两个参数,province是参数名称 北京是参数值 parameterMap.put(province , 北京); parameterMap.put(country, china); FileOutputStream outputStream; /得到参数后重新生成报表 outputStream = new FileOutputStream(new File(E:newtemplateURLParameterDemo.cpt); TemplateExporter templateExporter = new TemplateExporter(); templateExporter.export(outputStream, wbTpl.execute(parameterMap) ; catch(Exception
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【2026】年家用电子产品维修工职业技能鉴定题库及解析(附答案与解释)
- 儿童流感诊疗及预防指南总结【2026】
- 2026年农村电商物流成本优化策略题库
- 中医骨科护理的刮痧疗法
- 消化内镜护理中的特殊人群护理
- 食管癌患者护理实践新方法
- 高级中学体育与健康教师资格考试面试重点难点精练试题解析(2026年)
- 山西省长治市壶关县2025届四年级数学下学期期中达标检测模拟试题含答案
- 广东省惠州市英华校2026年中考三模物理试题含解析
- 2026年四川南充市嘉陵区重点名校中考三模物理试题含解析
- 2026内蒙古乌海市国创数字产业发展有限责任公司招聘15人考试备考试题及答案解析
- 2026年江苏省自考13428当代中国政府与政治考点重点
- 2026河北建投交通投资有限责任公司暑期实习生招聘笔试参考试题及答案解析
- 2026长江科学院武汉长江科创科技发展有限公司招聘26人笔试参考题库及答案解析
- 2026年九年级数学中考模拟试卷(重庆卷)
- 2026年广西职业技术学院教师招聘考试参考题库及答案解析
- 2026年超星尔雅人工智能与信息社会练习题库含答案详解【B卷】
- 《地理信息数据分类分级工作指南(试行)》
- 城市公园公共厕所堵塞应急预案
- 14 《我们都是中国人》 第一课时(教学设计)道法统编版二年级上册(新教材)
- 2025年自治区体育局直属单位自治区体育科研中心(自治区反兴奋剂中心)面向社会工作人员(5人)笔试历年典型考题(历年真题考点)解题思路附带答案详解
评论
0/150
提交评论