-
上一节,我们介绍了Java开源报表JasperReport、iReport4.5.1使用详解(一) JasperReport、iReport4.5.1这两款开源软件,本节来个例子,实战下。
一.数据源设计
图1-1
打开上图中红色部分所示:进行当前报表的数据源的设计,我们本节写的是Sql语句
图1-2
选择OK 之后,此语句涉及的字段都会显示在Fields下面:
图1-3
二.报表的结构介绍
图1-4
报表的结构包括如下部分:Title、Page Header、Column Header、Detail、Column Footer、Page Footer、Summary.下面一一的介绍各个部分。
Title:为报表的标题部分,如果报表有多页,则只显示在第一页。
Page Header :为报表每页的一个头部名称,如果报表有多页,则每页都会显示。
Column Header:可以理解成表头,如果报表有多页,则每页都会显示。
Detail:详细记录,迭代列出所有的查询结果,有多少数据都会显示出来(分页)。
Column Footer:相当于表尾,如果报表有多页,则每页都会显示。
Page Footer:与Page Header对应,每页都会显示。
Summary:报表的一些统计信息。比如共有多少页,当前是第几页等信息。
三、接下来,我们试着制作一份报表出来。
改报表的要求是:列出所有用户的信息,(查询语句决定。)
①我们从组件面板中,拖出一个 Static Text 组件来,放置在报表的Title部分,输入“用户账户清单”。
②在Page Header 也同样拖入一个 Static Text 组件,输入“管理员”
③展开左侧的 Report Inspector,展开Fields子项,将图1-3所示的字段,拖入Detail项中,此时会发现,Column Header项中自动填充了Static Text的表头,也可以对表头进行编辑,重命名等操作。可以调整各组件的位置、大小等信息。
如图所示:
图3-1
④预览,选择Preview (图3-1红色框部分)即可。
结果如下图所示:
图4-1
生成的文档信息如下:
Compiling to file... G:\Jaspersoft\iReport-4.1.1\ireport\fonts\report1.jasper Compilation running time: 297! Filling report... Locale: 中文 (中国) Time zone: Default Report fill running time: 203! (pages generated: 2) Exporting PDF (using iText) to file... G:\Jaspersoft\iReport-4.1.1\ireport\fonts\report1.pdf! Export running time: 94! Executing: "E:\Adobe\Reader 10.0\Reader\AcroRd32.exe" "G:\Jaspersoft\iReport-4.1.1\ireport\fonts\report1.pdf"
与此同时,会自动弹出一个report1.pdf的文档,注意,这里可能有些同学会出现中文显示不了的情况,这里需强调一下的是,要想显示中文,需要需要进行一些配置。
在iReport的classpath里面导入包含了中文的字符的jar文件,还有供Pdf使用的字符jar包。工具-->选项-->font
如果没有,则需加入到classpath中
图4-1-1
也可以添加自己所需要的字体。
iTextAsian.jar的最新的jar包可以到下面的地址下载。
http://sourceforge.net/projects/itext/files/extrajars/
包含在 extrajars-2.2.zip 中
图4-1-2
文本框默认的是:SansSerif字体,需要改成我们中文的字体
图4-1-3
关于字体的安装,后面的部分会介绍到。
本节我们将介绍,导出成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测试页面:
<%@ page contentType="text/html;charset=utf-8"%> <%@ page import="net.sf.jasperreports.engine.*"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*" %> <%@ page import="java.sql.*" %> <% String ctxpath = request.getContextPath(); Class.forName("net.sourceforge.jtds.jdbc.Driver"); String url="jdbc:jtds:sqlserver://server:1433/pcbsyn"; String user="sa"; String password="711"; Connection conn= DriverManager.getConnection(url,user,password); //ireport生成的.jasper文件的存放位置,这里为了方便放置在根目录下面 File reportFile = new File(this.getServletContext().getRealPath("/report1.jasper")); Map parameters = new HashMap(); try { //执行报表程序 JasperRunManager.runReportToHtmlFile(reportFile.getPath(),parameters, conn); response.sendRedirect(ctxpath+"/report1.html"); } catch (Exception e) { System.out.println( e.getMessage() ); } finally { try { conn.close(); } catch (Exception ex) { System.out.println( ex.getMessage() ); } } %>
图1.4.1
页面报错:
java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException
解决办法:导入lib下面的groovy-all-1.7.5.jar 包即可解决问题。
这个是html的页面。
二、导出成Pdf方式。
①建立generatePdf.jsp文件
<%@ page contentType="text/html;charset=utf-8"%> <%@ page import="net.sf.jasperreports.engine.*"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*" %> <%@ page import="java.sql.*" %> <% //报表编译之后生成的.jasper文件的存放位置 File reportFile = new File(this.getServletContext().getRealPath("report1.jasper")); String url="jdbc:jtds:sqlserver://server:1433/pcbsyn"; Class.forName("net.sourceforge.jtds.jdbc.Driver"); Map parameters = new HashMap(); Connection conn = DriverManager.getConnection(url, "sa", "711"); byte[] bytes=JasperRunManager.runReportToPdf(reportFile.getPath(),parameters ,conn); response.setContentType("application/pdf"); response.setContentLength(bytes.length); ServletOutputStream outStream = response.getOutputStream(); outStream.write(bytes,0,bytes.length); outStream.flush(); outStream.close(); out.clear(); out = pageContext.pushBody(); %>
运行
http://localhost:8080/IreportTest/generatePdf.jsp
之后报错:
org.apache.jasper.JasperException: net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font : pdfFontName : Helvetica pdfEncoding : UniGB-UCS2-H isPdfEmbedded : true org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:491) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
出现这个错误主要是因为:没有导入iTextAsian.jar、iTextAsianCmaps.jar
解决办法:
1.导入iTextAsian.jar、iTextAsianCmaps.jar 包
2.设置字体属性如下图所示:
图2.1
注意:如果使用的是自定义的字体,也就是自己安装的字体,则需要导入相应字体的jar包 本人使用的是simfang.jar。
图2.2
三、导出成Excel格式:
测试代码如下:
import java.io.File; import java.io.FileOutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.HashMap; import java.util.Map; import net.sf.jasperreports.engine.JRAbstractExporter; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.export.JExcelApiExporter; publicclass TestExcel { publicstaticvoid main(String[] args) { File reportFile = new File( "WebRoot\\report1.jasper"); Map parameters = new HashMap(); Connection conn = null; FileOutputStream output = null; try { String driver = "net.sourceforge.jtds.jdbc.Driver"; String url = "jdbc:jtds:sqlserver://server:1433/pcbsyn"; Class.forName(driver); conn = DriverManager.getConnection(url, "sa", "711"); Map parameter = new HashMap(); JasperPrint report = null; report = JasperFillManager.fillReport(reportFile.getPath(), parameter, conn); JRAbstractExporter exporter = new JExcelApiExporter(); output = new FileOutputStream("D:\\excel.xls"); exporter.setParameter(JRExporterParameter.JASPER_PRINT, report); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output); exporter.exportReport(); } catch (Exception e) { e.printStackTrace(); } finally { try { output.close(); } catch (Exception e) { e.printStackTrace(); } try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
运行的时候报错:
java.lang.NullPointerException at com.yaxing.excel.TestExcel.main(TestExcel.java:41) Exception in thread "main" java.lang.NoClassDefFoundError: jxl/write/biff/RowsExceededException at com.yaxing.excel.TestExcel.main(TestExcel.java:32) Caused by: java.lang.ClassNotFoundException: jxl.write.biff.RowsExceededException at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) ... 1 more
这是因为没有导入所需要的jxl.jar包,这个包是用来处理Excel文件的。
同样可以在lib目录下面查找。再运行一次,可以发现,已经生成了我们所需要的excel文件。
最后生成的excel文件如图:
图3.1
四、使用使用Scriptlet来填充报表。
①编写Scriptlet类,需要继承自JRDefaultScriptlet(net.sf.jasperreports.engine.JRDefaultScriptlet),
import java.util.Date; import net.sf.jasperreports.engine.JRDefaultScriptlet; import net.sf.jasperreports.engine.JRScriptletException; publicclass ScriptLetDemo extends JRDefaultScriptlet{ long pageinitTime = 0; public String getResult(){ return"Hello,Scriptlet"; } @Override publicvoid beforePageInit() throws JRScriptletException { // TODO Auto-generated method stub pageinitTime = new Date().getTime(); } }
我们要制作的报表是,报表有个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如图:
Java开源报表JasperReport、iReport4.5.1使用详解(二)
最新推荐文章于 2022-07-14 10:33:59 发布