Java開源報表JasperReport、iReport4.5.1使用詳解(二)

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

生成的文檔信息如下:

  1.  Compiling to file... G:\Jaspersoft\iReport-4.1.1\ireport\fonts\report1.jasper  

  2. Compilation running time: 297!  

  3.  Filling report...  

  4.  Locale: 中文 (中國)  

  5.  Time zone: Default  

  6. Report fill running time: 203! (pages generated: 2)  

  7.  Exporting PDF (using iText) to file... G:\Jaspersoft\iReport-4.1.1\ireport\fonts\report1.pdf!  

  8. Export running time: 94!  

  9. 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測試頁面:


  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 conn= DriverManager.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. %>

圖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. File(this.getServletContext().getRealPath("report1.jasper"));  

  10. String url="jdbc:jtds:sqlserver://server:1433/pcbsyn";  

  11. Class.forName("net.sourceforge.jtds.jdbc.Driver");  

  12. Map parameters = new HashMap();  

  13. Connection conn = DriverManager.getConnection(url, "sa",  

  14. "711");  

  15. byte[]  

  16. bytes=JasperRunManager.runReportToPdf(reportFile.getPath(),parameters  

  17. ,conn);  

  18. response.setContentType("application/pdf");  

  19. response.setContentLength(bytes.length);  

  20. ServletOutputStream outStream = response.getOutputStream();  

  21. outStream.write(bytes,0,bytes.length);  

  22. outStream.flush();  

  23. outStream.close();  

  24. out.clear();  

  25. out = pageContext.pushBody();  

  26. %>


運行

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)  


出現這個錯誤主要是因爲:沒有導入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. import net.sf.jasperreports.engine.JasperPrint;  

  11. import net.sf.jasperreports.engine.export.JExcelApiExporter;  

  12. publicclass TestExcel {  

  13. publicstaticvoid main(String[] args) {  

  14.        File reportFile = new File(  

  15. "WebRoot\\report1.jasper");  

  16.        Map parameters = new HashMap();  

  17.        Connection conn = null;  

  18.        FileOutputStream output = null;  

  19. try {  

  20.            String driver = "net.sourceforge.jtds.jdbc.Driver";  

  21.            String url = "jdbc:jtds:sqlserver://server:1433/pcbsyn";  

  22.            Class.forName(driver);  

  23.            conn = DriverManager.getConnection(url, "sa", "711");  

  24.            Map parameter = new HashMap();  

  25.            JasperPrint report = null;  

  26.            report = JasperFillManager.fillReport(reportFile.getPath(),  

  27.                    parameter, conn);  

  28.            JRAbstractExporter exporter = new JExcelApiExporter();  

  29.            output = new FileOutputStream("D:\\excel.xls");  

  30.            exporter.setParameter(JRExporterParameter.JASPER_PRINT, report);  

  31.            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output);  

  32.            exporter.exportReport();  

  33.        } catch (Exception e) {  

  34.            e.printStackTrace();  

  35.        } finally {  

  36. try {  

  37.                output.close();  

  38.            } catch (Exception e) {  

  39.                e.printStackTrace();  

  40.            }  

  41. try {  

  42.                conn.close();  

  43.            } catch (Exception e) {  

  44.                e.printStackTrace();  

  45.            }  

  46.        }  

  47.    }  

  48. }


運行的時候報錯:


  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. import net.sf.jasperreports.engine.JRDefaultScriptlet;  

  3. import net.sf.jasperreports.engine.JRScriptletException;  

  4. publicclass ScriptLetDemo extends JRDefaultScriptlet{  

  5. long pageinitTime = 0;  

  6. public String getResult(){  

  7. return"Hello,Scriptlet";  

  8.    }  

  9. @Override

  10. publicvoid beforePageInit() throws JRScriptletException {  

  11. // TODO Auto-generated method stub

  12.        pageinitTime = new Date().getTime();  

  13.    }  

  14. }

我們要製作的報表是,報表有個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如圖:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章