报表打印是报表使用和开发过程中经常碰到的问题,这里汇总了关于Web报表开发打印功能的一些典型应用案例,以应用最广泛的FineReport为例。
案例一:java直接调用报表打印
当java后台定义定时打印的功能,同时又需要直接调用报表的打印的时候,由于打印机型号和纸张不同,需要指定打印机,从而打印是否成功并设置返回值。那么怎么样可以实现这一过程呢?
实现过程
1、定义报表运行环境
// 定义报表运行环境,才能执行报表 String envPath = "D:\\FineReport\\develop\\code\\build\\package\\WebReport\\WEB-INF"; FRContext.setCurrentEnv(new LocalEnv(envPath));
2、定义执行模板工作簿
TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(), "GettingStarted.cpt");
3、 获取报表参数并设置值
// 参数传值 Parameter[] parameters = workbook.getParameters(); HashMap<String, String> paraMap = new HashMap<String, String>(); paraMap.put(parameters[0].getName(), "华北");
4、 java中调用报表打印方法并进行判断
通过公式PrintUtils.printWorkBook(cptPath)进行打印,此时不弹出打印窗口。
若需打印选项对话框,则使用PrintUtils.printWorkBook(cptPath, true),其中参数true为显示打印选项对话框,代码如下所示:
// java中调用报表打印方法 boolean a = PrintUtils.printWorkBook("GettingStarted.cpt", paraMap, true); if (a == false) { System.out.println("失败啦!返回" + a); } else { System.out.println("成功!返回" + a); }
其中printWorkBook()返回值为boolean型,可通过返回值true(打印成功)和false(打印失败)来判断打印是否成功。
5、 完整代码
上述所示的过程的可以通过完整代码来编辑进行打印,如下所示:
package com.fr.io; import java.io.File; import java.util.HashMap; import com.fr.base.FRContext; import com.fr.base.Parameter; import com.fr.dav.LocalEnv; import com.fr.main.TemplateWorkBook; import com.fr.print.PrintUtils; public class JavaPrint { public static void main(String[] args) { // 定义报表运行环境,才能执行报表 String envPath = "D:\\FineReport\\develop\\code\\build\\package\\WebReport\\WEB-INF"; FRContext.setCurrentEnv(new LocalEnv(envPath)); try { TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(), "GettingStarted.cpt"); // 参数传值 Parameter[] parameters = workbook.getParameters(); HashMap<String, String> paraMap = new HashMap<String, String>(); paraMap.put(parameters[0].getName(), "华北"); // java中调用报表打印方法 boolean a = PrintUtils.printWorkBook("GettingStarted.cpt", paraMap, true); if (a == false) { System.out.println("失败啦!返回" + a); } else { System.out.println("成功!返回" + a); } } catch (Exception e) { e.printStackTrace(); } } }
编辑该程序,弹出打印机设置窗口,选择打印机就可以进行打印了,并在后台返回结构:成功!返回true。
案例二:打印模板与预览模板不同
问题反馈
在打印的过程中,有的用户可能会遇到如下情况:用户系统中使用iframe嵌入报表,客户端浏览器看到的是报表样式1,打印的时候不是看到的效果,而是样式2.例如用户系统显示报表的iframe大小固定,无法完全显示A4纸张大小的模板,因此在显示报表的时候进行了分页处理。如果直接将这个显示结构打印到A4纸上,每页纸上只显示固定条数据,下面全是空白的,这样既不美观又浪费纸张。
点击打印的时候,通过js调用FR的打印方法,使用打印模板进行打印,如下:
<html> <head> <script type="text/javascript" src="/WebReport/ReportServer?op=emb&resource=finereport.js"></script> <link rel="stylesheet" type="text/css" href="/WebReport/ReportServer?op=emb&resource=finereport.css"/> <script type="text/javascript"> function doFRPrint(){ //点击打印时触发 var reportURL="/WebReport/ReportServer?reportlet=report_print.cpt"; //打印模板路径,与BS查看的效果不同 FR.doURLFlashPrint(reportURL); //调用FR打印方法 } </script> </head> <body> <div id="toolbar"> <button type="button" onclick=doFRPrint()>打印</button> </div> <iframe id="reportFrame" src="/WebReport/ReportServer?reportlet=report.cpt&__showtoolbar__=false" width=100% height=80%></iframe> </body> </html>
案例三:将当前页数据入库数据入库
模板多张页面,如一些了的账簿模板,每次纸打印部分页面,每次打印后希望触发事件,在数据库中对于位置记录本页面对应的账簿已经打印过了。每张页面在固定位置有本张账簿的编号,对于到数据库中有一个记录是否已经打印的记录字段。
以已部署过FineReport的WebReport工程到tomcat服务器为例,其详细过程如下:
1、 对模板添加打印后事件
打开设计器,打开其tomcat报表共组目录,在菜单中点击报表>报表WEB属性>分页预览设置,在右边栏中,如点击添加Flash打印后事件。
在其JavaScript中,输入js代码,目的是调用其WedReport工程下写的一个jsp的执行入库操作。
2.、获取所在页单元格的值
如编号ID在J3单元格,即第三行、第十列,则js方法如下:
var a =$("#r-2-0","div.reportPane").children().eq(9)[0].innerHTML;
3、通过Ajax把值传到jsp页面
完整代码如下:
var a =$("#r-2-0","div.reportPane").children().eq(9)[0].innerHTML;
$.ajax({
url : 'http://localhost:8080/WebReport/print1.jsp?ID='+a
})
4、定义jsp获取编号修改数据库表
定义页面print1.jsp,首先获取编号ID的值,连接数据库通过update语句把表中toprint字段进行修改,代码如下:
package com.fr.io; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import com.fr.base.FRContext; import com.fr.base.Env; public class SaveReportToDatabase { public static void main(String[] args) { SaveReport(); } private static void SaveReport() { try { // 连接数据库 String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@192.168.100.169:1521:orcl10g"; String user = "temp"; String pass = "temp123"; Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, pass); PreparedStatement presmt = conn .prepareStatement("insert into report values(?,?)"); // 读进需要保存入库的模板文件 Env oldEnv = FRContext.getCurrentEnv(); String envPath = oldEnv.getPath(); File cptfile = new File(envPath + "\\reportlets\\gettingstarted.cpt"); int lens = (int) cptfile.length(); InputStream ins = new FileInputStream(cptfile); // 将模板保存入库 presmt.setString(1, "gettingstarted.cpt"); // 第一个字段存放模板相对路径 presmt.setBinaryStream(2, ins, lens); // 第二个字段存放模板文件的二进制流 presmt.execute(); conn.commit(); presmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
案例四:将打印信息提交入库
打印时,有时想清楚的知道,哪些报表在什么时间被打印的信息,并将其记录到数据库的一张记录表中,以方便查看相关信息。一般地,点击打印后就会直接触发打印事件,即点击打印就是执行打印的状态。以整个工程,在浏览器中对其中的报表预览时,点击FLASH打印后将其打印信息记录到库表中为例。
1、 新建信息表
新建一张记录信息表,如:在access数据库中新建一张表,命名为表1。其中输入两个字段:date和tableName,类型分别为日期和文本类型。
2、 添加打印后事件
点击服务器>服务器配置,选择分页预览设置选项,进入分页预览设置窗口。在右边栏中,点击添加FLASH打印后事件,如下图所示:
选择提交入库及选择其信息记录表,且点击智能添加字段后,如上在date中输入公式:=today()获取当前日期,在tablename中输入公式:=reportName获取当前打印的报表。
案例五:动态打印
在进行报表查看时,有时会发现一两条重要或者错误信息,需要将其进行打印出来备份一下,这时就需要动态实现打印效果,勾选需打印的信息,将其打印出来。
1、 父模板
-
数据准备
新建模板,新建数据查询:sql为SELECT * FROM 雇员。
-
报表主体设计
在A3单元格中使用复选框控件,用来勾选需要打印的信息,如下图:
-
获取复选框的值
为复选框添加初始化事件,将勾选项的信息放到数组中保存,代码如下:
if(!FR.checkBoxes){ FR.checkBoxes=new Array(); } var len=FR.checkBoxes.length; FR.checkBoxes[len]=this;
-
工具栏添加自定义打印按钮
点击模板>模板web属性>填报页面设置,选择为该模板单独设置,添加一个自定义打印按钮至工具栏中,并把自定义打印按钮清空
自定义JavaScript,代码如下:
var joinData=function(){ var datas=[]; for(var i=0;i<FR.checkBoxes.length;i++){ var checkBox=FR.checkBoxes[i]; if(checkBox.getValue()===true){ var colRow=FR.cellStr2ColumnRow(checkBox.options.location); colRow.col++; var location=FR.columnRow2CellStr(colRow); var value=_g().getCellValue(location,null); datas[datas.length]=value; } } return datas.join(","); } var data=joinData(); var url="http://localhost:8075/WebReport/ReportServer?reportlet=doc/Advanced/PrintReport/SelectPrint_son.cpt"+"&ids="+data; window.onbeforeunload=null; FR.doURLPDFPrint(url);
并保存
1、 子模板
-
数据准备
新建模板,新建数据查询ds1,sql为SELECT * FROM 雇员 where 雇员id in (${ids}),该参数是为了接收父模板传递过来的雇员id。
-
报表主体设计
保存
3、 预览和打印
打开父模板,点击填报预览,选中需要打印的数据,点击工具栏上的打印按钮,即可将选中信息打印出来了,如下图:
相关推荐
总结来说,FineReport的Web报表打印功能是一个技术结合应用的典型实例。它不仅涵盖了报表打印的基本需求,还提供了与Java后端技术相结合的高级应用案例。开发者可以利用FineReport的API完成高质量的打印任务,并通过...
《Web报表工具FineReport全方位解析》 FineReport是一款强大的Web报表工具,专为解决企业数据可视化、报表设计等问题而生。本教程将深入探讨FineReport的功能特性,帮助用户全面掌握其使用技巧,实现高效的数据管理...
FineReport是一个专业的报表工具,特别是在移动端报表开发中表现出色。本文针对FineReport在移动端的JavaScript(JS)二次开发给出了一些示例和说明。以下详细知识点涵盖了移动端报表开发中如何利用FineReport的JS...
在本文中,我们将深入探讨如何将Web应用与Spring Boot框架集成帆软报表工具Finereport。Spring Boot以其简洁、高效和自动配置的特性,成为Java领域开发微服务和Web应用的首选框架。而Finereport作为一款强大的报表...
### web报表插件FineReport在医院院长查询分析系统中的应用 #### 一、医院院长查询系统的价值 随着信息技术的发展,大中型医院的信息处理正在经历一场深刻的变革——从传统的手工方式快速转向现代化的电脑信息化...
FineReport是一个企业级报表工具,广泛应用于商务智能和数据分析领域。用户可通过FineReport制作各种复杂的报表,并通过Web浏览器进行展示。报表的灵活性和强大的数据处理能力,使得它在处理大量数据和生成复杂报表...
该案例整合了java流行框架springboot和报表制作工具帆软,帆软版本10.0,内附整合文档,有问题可以咨询QQ:361440206 整合项目介绍:https://blog.csdn.net/qq_39408914/article/details/100765504
设计完成后,需要保存报表模板,通常保存在FineReport的工作目录下,例如 `%FineReport_HOME%/WebReport/WEB-INF/reportlets/`,并指定一个唯一的文件名,如 `5.3.cpt`。保存后,可以通过报表服务器预览报表,或者...
Finereport是帆软公司开发的一款强大的报表工具,它支持多种数据源,包括关系型数据库、NoSQL数据库以及大数据平台等。Finereport提供丰富的图表类型和自定义样式,使得报表设计灵活多样。此外,其拖拽式操作界面...
FineReport是一款国产的报表设计工具,由帆软软件有限公司开发。该工具集数据处理与展示于一体,支持多种数据源接入方式,能够灵活应对复杂多变的数据处理需求。FineReport不仅具备强大的报表设计功能,还提供了丰富...
是针对帆软报表工具——FineReport的详细使用手册,涵盖多个方面,包括快速入门、设计思路、报表设计、参数应用、图表、填报、操作指南、授权注册、报表美化、移动端、大屏数据可视化、数据连接、性能优化、二次开发...
19. **Web页面集成**:讨论如何将报表嵌入到Web应用中,提供统一的用户体验。 20. **企业级集成方案**:针对大型企业的需求,提供了与其他系统的集成策略。 21. **专题总结**:包括日志规范、报错分类、常见问题...