关于Web报表FineReport打印的开发应用案例

简介:

报表打印是报表使用和开发过程中经常碰到的问题,这里汇总了关于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、  预览和打印

打开父模板,点击填报预览,选中需要打印的数据,点击工具栏上的打印按钮,即可将选中信息打印出来了,如下图:


本文转自 雄霸天下啦 51CTO博客,原文链接:http://blog.51cto.com/10549520/1844789,如需转载请自行联系原作者

相关文章
|
17天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
75 3
|
23天前
|
设计模式 测试技术 持续交付
开发复杂Web应用程序
【10月更文挑战第3天】开发复杂Web应用程序
31 2
|
25天前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
39 3
|
2天前
|
JavaScript 前端开发 Java
SpringBoot_web开发-webjars&静态资源映射规则
https://www.91chuli.com/ 举例:jquery前端框架
9 0
|
2月前
|
数据可视化 图形学 UED
只需四步,轻松开发三维模型Web应用
为了让用户更方便地应用三维模型,阿里云DataV提供了一套完整的三维模型Web模型开发方案,包括三维模型托管、应用开发、交互开发、应用分发等完整功能。只需69.3元/年,就能体验三维模型Web应用开发功能!
267 8
只需四步,轻松开发三维模型Web应用
|
2月前
|
前端开发 机器人 测试技术
【RF案例】Web自动化测试弹窗处理
在进行Web自动化测试时,常会遇到不同类型的弹窗,如ajax、iframe、新窗口及alert/Confirm等。这些弹窗可通过Selenium进行定位与处理。其中,ajax弹窗直接定位处理;iframe需先选中再操作;新窗口类似iframe处理;而alert/Confirm则需特殊方法应对。在Robot Framework中,需先定义并获取窗口后使用特定关键字处理。此外,还有部分div弹窗需在消失前快速定位。希望本文能帮助大家更好地处理各类弹窗。
38 6
【RF案例】Web自动化测试弹窗处理
|
2月前
|
前端开发 数据安全/隐私保护
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
本文档详细介绍了HTML表单的多种元素及其用法,包括下拉菜单(`&lt;select&gt;` 和 `&lt;option&gt;`)、文本域(`&lt;textarea&gt;`)、标签解释(`&lt;label&gt;`)、各类按钮(`&lt;button&gt;`)及表单重置功能、无语义布局标签(`&lt;div&gt;` 和 `&lt;span&gt;`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
|
2月前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
100 6
|
2月前
|
存储 JSON API
实战派教程!Python Web开发中RESTful API的设计哲学与实现技巧,一网打尽!
在数字化时代,Web API成为连接前后端及构建复杂应用的关键。RESTful API因简洁直观而广受欢迎。本文通过实战案例,介绍Python Web开发中的RESTful API设计哲学与技巧,包括使用Flask框架构建一个图书管理系统的API,涵盖资源定义、请求响应设计及实现示例。通过准确使用HTTP状态码、版本控制、错误处理及文档化等技巧,帮助你深入理解RESTful API的设计与实现。希望本文能助力你的API设计之旅。
61 3
|
2月前
|
JSON API 数据库
从零到英雄?一篇文章带你搞定Python Web开发中的RESTful API实现!
在Python的Web开发领域中,RESTful API是核心技能之一。本教程将从零开始,通过实战案例教你如何使用Flask框架搭建RESTful API。首先确保已安装Python和Flask,接着通过创建一个简单的用户管理系统,逐步实现用户信息的增删改查(CRUD)操作。我们将定义路由并处理HTTP请求,最终构建出功能完整的Web服务。无论是初学者还是有经验的开发者,都能从中受益,迈出成为Web开发高手的重要一步。
57 4