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的文檔,注意,這裏可能有些同學會出現中文顯示不了的情況,這裏需強調一下的是,要想顯示中文,需要需要進行一些配置。
工具-->選項-->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如圖: