Java开源报表JasperReport、iReport4.5.1使用详解(三)

简介:

Java开源报表JasperReport、iReport4.5.1使用详解(三)

前面两节,我们介绍、并亲手制作了一个报表,

本节我们将介绍,导出成Html、Excel、Pdf、以及从Scriptlet获取数据。

一、导出成Html方式

①首先建立一个 web project

 

 

图1.1.1

②导入相应的jar包到工程里面

jasperreports-4.5.1\dist 下面所有jar包,共4个

jasperreports-4.5.1.jar

jasperreports-applet-4.5.1.jar

jasperreports-fonts-4.5.1.jar

jasperreports-javaflow-4.5.1.jar

然后是jasperreports-4.5.1-project\jasperreports-4.5.1\lib 下面 com开头的所有jar包

commons-beanutils-1.8.0.jar

commons-collections-2.1.1.jar

commons-digester-2.1.jar

commons-javaflow-20060411.jar

commons-logging-1.1.1.jar

③将我们第二节中生成的jasper 文件复制进我们的web目录下面

ireport\fonts\report1.jasper

④编写jsp测试页面:

 


 
 
  1. <%@ page contentType="text/html;charset=utf-8"%> 
  2. <%@ page import="net.sf.jasperreports.engine.*"%> 
  3. <%@ page import="java.util.*"%> 
  4. <%@ page import="java.io.*" %> 
  5. <%@ page import="java.sql.*" %> 
  6. <%  
  7. String ctxpath = request.getContextPath();  
  8. Class.forName("net.sourceforge.jtds.jdbc.Driver");  
  9. String url="jdbc:jtds:sqlserver://server:1433/pcbsyn";  
  10. String user="sa";  
  11. String password="711";  
  12. Connection connDriverManager.getConnection(url,user,password);  
  13. //ireport生成的.jasper文件的存放位置,这里为了方便放置在根目录下面  
  14. File reportFile = new 
  15. File(this.getServletContext().getRealPath("/report1.jasper"));   
  16. Map parameters = new HashMap();  
  17. try {  
  18. //执行报表程序  
  19. JasperRunManager.runReportToHtmlFile(reportFile.getPath(),parameters, conn);  
  20. response.sendRedirect(ctxpath+"/report1.html");   
  21. }  
  22. catch (Exception e) {  
  23. System.out.println( e.getMessage() );  
  24. }  
  25. finally {  
  26. try {  
  27. conn.close();  
  28. }  
  29. catch (Exception ex) {  
  30. System.out.println( ex.getMessage() );  
  31. }  
  32.  
  33. }  
  34. %> 

图1.4.1

页面报错:

java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException

解决办法:导入lib下面的groovy-all-1.7.5.jar 包即可解决问题。

这个是html的页面。

 

二、导出成Pdf方式。

①建立generatePdf.jsp文件

 


 
 
  1. <%@ page contentType="text/html;charset=utf-8"%> 
  2. <%@ page import="net.sf.jasperreports.engine.*"%> 
  3. <%@ page import="java.util.*"%> 
  4. <%@ page import="java.io.*" %> 
  5. <%@ page import="java.sql.*" %> 
  6. <%  
  7. //报表编译之后生成的.jasper文件的存放位置  
  8. File reportFile = new 
  9.  
  10. File(this.getServletContext().getRealPath("report1.jasper"));  
  11. String url="jdbc:jtds:sqlserver://server:1433/pcbsyn";  
  12. Class.forName("net.sourceforge.jtds.jdbc.Driver");  
  13. Map parameters = new HashMap();  
  14. Connection conn = DriverManager.getConnection(url, "sa",  
  15. "711");  
  16. byte[]  
  17. bytes=JasperRunManager.runReportToPdf(reportFile.getPath(),parameters  
  18. ,conn);  
  19. response.setContentType("application/pdf");  
  20. response.setContentLength(bytes.length);  
  21. ServletOutputStream outStream = response.getOutputStream();  
  22. outStream.write(bytes,0,bytes.length);  
  23. outStream.flush();  
  24. outStream.close();  
  25. out.clear();  
  26. out = pageContext.pushBody();  
  27. %> 


 

运行

http://localhost:8080/IreportTest/generatePdf.jsp

之后报错:


 
 
  1. org.apache.jasper.JasperException: net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font :   
  2. pdfFontName   : Helvetica  
  3. pdfEncoding   : UniGB-UCS2-H  
  4. isPdfEmbedded : true  
  5.     org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:491)  
  6.     org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)  
  7.     org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)  
  8.     org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)  
  9.     javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
  10.  

 

出现这个错误主要是因为:没有导入iTextAsian.jar、iTextAsianCmaps.jar

解决办法:

1.导入iTextAsian.jar、iTextAsianCmaps.jar 包

2.设置字体属性如下图所示:

图2.1

注意:如果使用的是自定义的字体,也就是自己安装的字体,则需要导入相应字体的jar包 本人使用的是simfang.jar。

 

 

 图2.2

三、导出成Excel格式:

测试代码如下:


 
 
  1. import java.io.File;  
  2. import java.io.FileOutputStream;  
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7. import net.sf.jasperreports.engine.JRAbstractExporter;  
  8. import net.sf.jasperreports.engine.JRExporterParameter;  
  9. import net.sf.jasperreports.engine.JasperFillManager;  
  10.    
  11. import net.sf.jasperreports.engine.JasperPrint;  
  12. import net.sf.jasperreports.engine.export.JExcelApiExporter;  
  13.  
  14. public class TestExcel {  
  15.     public static void main(String[] args) {  
  16.         File reportFile = new File(  
  17.                 "WebRoot\\report1.jasper");  
  18.         Map parameters = new HashMap();  
  19.         Connection conn = null;  
  20.         FileOutputStream output = null;  
  21.         try {  
  22.             String driver = "net.sourceforge.jtds.jdbc.Driver";  
  23.             String url = "jdbc:jtds:sqlserver://server:1433/pcbsyn";  
  24.             Class.forName(driver);  
  25.             conn = DriverManager.getConnection(url, "sa""711");  
  26.             Map parameter = new HashMap();  
  27.             JasperPrint report = null;  
  28.             report = JasperFillManager.fillReport(reportFile.getPath(),  
  29.                     parameter, conn);  
  30.             JRAbstractExporter exporter = new JExcelApiExporter();  
  31.             output = new FileOutputStream("D:\\excel.xls");  
  32.             exporter.setParameter(JRExporterParameter.JASPER_PRINT, report);  
  33.             exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output);  
  34.             exporter.exportReport();  
  35.         } catch (Exception e) {  
  36.             e.printStackTrace();  
  37.         } finally {  
  38.             try {  
  39.                 output.close();  
  40.             } catch (Exception e) {  
  41.                 e.printStackTrace();  
  42.             }  
  43.             try {  
  44.                 conn.close();  
  45.             } catch (Exception e) {  
  46.  
  47.                 e.printStackTrace();  
  48.             }  
  49.         }  
  50.     }  


运行的时候报错:
 

 


 
 
  1. java.lang.NullPointerException  
  2.     at com.yaxing.excel.TestExcel.main(TestExcel.java:41)  
  3. Exception in thread "main" java.lang.NoClassDefFoundError: jxl/write/biff/RowsExceededException  
  4.     at com.yaxing.excel.TestExcel.main(TestExcel.java:32)  
  5. Caused by: java.lang.ClassNotFoundException: jxl.write.biff.RowsExceededException  
  6.     at java.net.URLClassLoader$1.run(URLClassLoader.java:202)  
  7.     at java.security.AccessController.doPrivileged(Native Method)  
  8.     at java.net.URLClassLoader.findClass(URLClassLoader.java:190)  
  9.     at java.lang.ClassLoader.loadClass(ClassLoader.java:307)  
  10.     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)  
  11.     at java.lang.ClassLoader.loadClass(ClassLoader.java:248)  
  12.     ... 1 more  

这是因为没有导入所需要的jxl.jar包,这个包是用来处理Excel文件的。

同样可以在lib目录下面查找。再运行一次,可以发现,已经生成了我们所需要的excel文件。

最后生成的excel文件如图:

 

图3.1

四、使用使用Scriptlet来填充报表。

①编写Scriptlet类,需要继承自JRDefaultScriptlet(net.sf.jasperreports.engine.JRDefaultScriptlet),


 
 
  1. import java.util.Date;  
  2.  
  3. import net.sf.jasperreports.engine.JRDefaultScriptlet;  
  4. import net.sf.jasperreports.engine.JRScriptletException;  
  5.  
  6. public class ScriptLetDemo extends JRDefaultScriptlet{  
  7.     long pageinitTime = 0;  
  8.     public String getResult(){  
  9.         return "Hello,Scriptlet";  
  10.     }  
  11.     @Override 
  12.     public void beforePageInit() throws JRScriptletException {  
  13.         // TODO Auto-generated method stub  
  14.         pageinitTime = new Date().getTime();  
  15.     }  

我们要制作的报表是,报表有个Text Field的值,是这个ScriptletDemo 里面返回的值。

②将此ScriptLetDemo 导出成jar文件

myeclipse的导出方式很简单,选择这个ScriptLetDemo.java

File-->Export-->Java-->Java\Jar file 选择保存路径即可。

为什么要导出成jar文件呢,因为我们的iReport需要这个jar文件。

③从iReport的组件面板中拖拉一个Text Field放入Detail中,

这个Text Filed 是表达式是:

((com.yaxing.excel.ScriptLetDemo)$P{REPORT_SCRIPTLET}).getResult()

前面括弧里面是ScriptletDemo 的路径,后面的REPORT 是默认的Scriptname,

如果我们的报表中有多个Script,则名字的规则是

<scriptlet name>_SCRIPTLET (.for example, scritplet1_SCRIPTLET)

预览下,即可:如图所示:Static Text 下面的值,即是我们程序中的值!

 

图4.1

文中有些代码不理解没关系,后文会有详细的介绍,只是先,我们熟悉下这个报表的使用方式、开发流程。

整个项目使用的jar如图:

 

 

 

 






 本文转自 w156445045 51CTO博客,原文链接:http://blog.51cto.com/enetq/803498,如需转载请自行联系原作者

相关文章
|
5月前
|
Java 数据安全/隐私保护
快手小红书抖音留痕工具,自动留痕插件工具,java代码开源
这个框架包含三个核心模块:主操作类处理点赞评论、配置管理类和代理管理类。使用时需要配合
|
3月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
1677 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
7月前
|
人工智能 Kubernetes Java
回归开源,两位 Java 和 Go 程序员分享的开源贡献指引
Higress是一个基于Istio和Envoy的云原生API网关,支持AI功能扩展。它通过Go/Rust/JS编写的Wasm插件提供可扩展架构,并包含Node和Java的console模块。Higress起源于阿里巴巴,解决了Tengine配置重载及gRPC/Dubbo负载均衡问题,现已成为阿里云API网关的基础。本文介绍Higress的基本架构、功能(如AI网关、API管理、Ingress流量网关等)、部署方式以及如何参与开源贡献。此外,还提供了有效的开源贡献指南和社区交流信息。
717 33
|
4月前
|
Java Linux Apache
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
314 5
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
|
3月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
7月前
|
人工智能 Java 程序员
JManus - 面向 Java 开发者的开源通用智能体
JManus 是一个以 Java 为核心、完全开源的 OpenManus 实现,隶属于 Spring AI Alibaba 项目。它旨在让 Java 程序员更便捷地使用 AI 技术,支持多 Agent 框架、网页配置 Agent、MCP 协议和 PLAN-ACT 模式。项目在 GitHub 上已获近 3k star,可集成多个大模型如 Claude 3.5 和 Qwen3。开发者可通过 IDE 或 Maven 快速运行项目,体验智能问答与工具调用功能。欢迎参与开源共建,推动通用 AI Agent 框架发展。
10645 65
|
8月前
|
人工智能 Java 决策智能
Java版Manus实现来了,Spring AI Alibaba发布开源OpenManus实现
此次官方发布的 Spring AI Alibaba OpenManus 实现,包含完整的多智能体任务规划、思考与执行流程,可以让开发者体验 Java 版本的多智能体效果。它能够根据用户的问题进行分析,操作浏览器,执行代码等来完成复杂任务等。
1559 57
|
6月前
|
NoSQL Java Redis
推荐一款好用的开源免费Java CMS内容管理站群系统
Java开源内容管理系统(JProcms),基于SpringCloud、SpringBoot、MyBatisPlus、Vue3等技术构建,采用Apache-2.0协议,支持免费商用。系统具备自定义字段存储与可视化设计、API制作网站群页面等功能,强调简单灵活的设计理念,降低二次开发成本。支持多种数据库、消息队列和认证方式,提供SaaS多租户、动态权限菜单、工作流配置等强大功能,同时集成阿里云、腾讯云服务,适用于高效建站与内容管理。
1188 4
|
SQL 监控 数据可视化
完全开源!国内首个完全开源JAVA企业级低代码平台
JeeLowCode 是一款专为企业打造的 Java 企业级低代码开发平台,通过五大核心引擎(SQL、功能、模板、图表、切面)和四大服务体系(开发、设计、图表、模版),简化开发流程,降低技术门槛,提高研发效率。平台支持多端适配、国际化、事件绑定与动态交互等功能,广泛适用于 OA、ERP、IoT 等多种管理信息系统,帮助企业加速数字化转型。
|
6月前
|
文字识别 监控 Java
顺丰同城抢单辅助脚本,顺丰骑士抢单辅助免封号,自动抢单神器【java版开源】
这是一套OCR实时检测订单列表并自动右滑的完整代码方案,适用于学习研究。代码包含四个主要模块:OCR处理(文字识别)、价格分析