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测试页面:
- <%@ 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;
- public class TestExcel {
- public static void 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;
- public class ScriptLetDemo extends JRDefaultScriptlet{
- long pageinitTime = 0;
- public String getResult(){
- return "Hello,Scriptlet";
- }
- @Override
- public void 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,则名字的规则是
预览下,即可:如图所示:Static Text 下面的值,即是我们程序中的值!
图4.1
文中有些代码不理解没关系,后文会有详细的介绍,只是先,我们熟悉下这个报表的使用方式、开发流程。
整个项目使用的jar如图: