jasper在JSP中匯出pdf和xls

來源:互聯網
上載者:User

環境配置

 1  正確安裝配置java的jdk

 2 將ireport放到c:/ireport

3 將ant放到c:/ant(我用的是bea的ant路徑是D:/bea/weblogic81/server/ant)

4 將jasperreports-1.2.0.jar 放置到當前classpath中(沒有加,我使用的Ireport/lib下已經存在了)

 5 將itext-1.3.1.jar放置到c:/ireport/lib(沒有加,我使用的Ireport/lib下已經存在了)

6 修改ireport/ireport.bat檔案,加入以下內容

set JAVA_HOME=C:/j2sdk1.4.2

set ANT_HOME=D:/bea/weblogic81/server/

 set IREPORT_HOME=c:/ireport rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport

我修改的是:

set JAVA_HOME=C:/j2sdk1.4.2

set ANT_HOME=D:/bea/weblogic81/server/

set IREPORT_HOME=F:/backup/iReport-1.2.0 rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport

(不過對以上修改,感覺沒有什麼用處)

7 提供一個正常提供服務的資料庫

現在高版本的ireport是不需要進行配置,可以直接使用的.

瞭解製作報表用的包

1 jasperreports-1.0.1.jar jasperreports是iReport的核心內容,jsperreport是一個報表製作程式,用它的規則制定一個xml檔案,然後編譯產生一個.jsper檔案,這個.jsper檔案是我們真正使用的,它很象.jsp檔案,使用的是它編譯後的servlet. (http://jasperreports.sourceforge.net/)

 2 itext-1.3.1.jar iText是一個開放源碼的Java類庫,是用來產生PDF檔案的。如果要在產生的pdf檔案顯示中文等亞洲字元,還必須下載itext的亞洲字元包iTextAsian.jar (http://itextdocs.lowagie.com/downloads/iTextAsian.jar)

 3 jfreechart-1.0.0-rc1.jar jfreechart是一款免費的、功能強大的統計圖產生工具,可以直接產生PNG,JPG等各式的檔案。 (http://www.jfree.org/jfreechart/)

4 jcommon-1.0.0-rc1.jar JCommon是一組有用的classes集合.它已經用在JFreeChart,JFreeReport與其它項目上. 這個類庫包含了以下功能: 文本工具類(text utilities), 用來顯示關於應用程式資訊的使用者介面類, 布局定製管理器, 一個日期選擇面板, 序列化工具類, XML解析器支援類. (http://www.jfree.org/jcommon/)

 5 poi-2.0-final-20040126.jar Apache的Jakata項目的POI子項目,目標是處理ole2對象。目前比較成熟的是HSSF介面,處理MS Excel(97-2002)對象。它不象我們僅僅是用csv產生的沒有格式的可以由Excel轉換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。直接調用poi包的不是ireport,而是jasperreport。 (http://www.apache.org/dyn/closer.cgi/jakarta/poi/)

 使用介紹

1 啟動:點擊ireport/ireport.bat啟動

 2 修改語言環境:tools-option-general中language中更改-apply

3 建立報表 file-new document 輸入名字-ok Portrait是縱向,Landscape是橫向。

 4 串連資料來源 datasource-connection/datasource-new-connections porperties- 輸入名字-選擇jdbc Driver,jdbc url-輸入username和password,-test測試通過表明資料來源串連正確-save儲存 (注意:必須保證資料庫驅動在lib目錄下)

 5 基本域說明

title域用來放報表的總標題

 pageHeaher域顧名思義頁頭

 columnHeader域是用來放static text的,也就是不迴圈的部分。

detail域是用來放text field的,也就是迴圈部分。

pageFooter域是用來放本頁的統計參數的。

 summary域是用來放整個表的統計參數的。

 可以直接調整每個域的長度,也可以通過Band properties來調整 (在我的項目中,只設定的title和detail,在title中顯示報表的總標題和所有parameters欄位,在detail中顯示需要迴圈的列表欄位)

 6 在報表中添加欄位static text edit-insert element -static text 滑鼠拖拉添加在頁面中雙擊或者右鍵properties在static text Tab 中輸入欄位名字,如果顯示有亂碼,font-font name中選擇"中文GB2312" border 中可以設定表格邊線樣式

7 在報表中添加欄位text field edit-insert element -text field 滑鼠拖拉添加在頁面中雙擊或者右鍵properties在text field 中輸入欄位名字, 樣式如同$F{text_field_name},

f表示為field變數,是資料庫中抽取出來的,你想在報表中顯示的資料庫內容,

p為parameter參數,是應用需要提供給報表的入口,比如想在報表被解釋的時候提供where語句的條件值, 就可以用$P(parameterName)比如: select * from bugs where proname=$P{projectName} order by proname,modulename

v為變數(顯示字型顏色為綠色,表示格式正確) border 中可以設定表格邊線樣式

8 調整報表布局滑鼠拖動各個欄位,拼接想要的報表布局,如果滑鼠點擊欄位, 顯示為紅色,說明該欄位跨越了兩個域顯示為綠色,說明兩個欄位疊加顯示為藍色,說明該欄位位置正確

9 報表添加SQL查詢語句 資料來源->報表查詢(datasource-report query) 在Report SQL query裡填寫SQl語句。如果語句正確,在下面的field裡就會顯示正常的表欄位。 (可以從顯示的所有欄位中選取想用做field的欄位,點擊ok後,自動添加為field動態欄位)

 10 為報表添加動態欄位預覽->報表欄位(view-Fields) 建立一個欄位,欄位名字必須和報表中Fields中添加名字一直,同時必須是sql結果集中存在的. (把fields裡的欄位直接拖到報表上也行)

11 為SQL語句添加參數 預覽->報表參數(view-parameters) 在parameters裡新增一個參數 paratemeter name 是參數名,在SQL語句裡寫成"$P{參數名}" paratemeter class type裡選擇參數類型。 注意:如果是int型的資料,最好在報表欄位裡將該欄位的Class type改成java.lang.String型的。 另外一種辦法,不管該欄位原來是什麼資料類型,直接在paratemeter class type裡選擇java.lang.String類型, 後在Default value expression 填寫"Integer.toString(整數)"。

 12 添加報表變數 預覽->報表變數 $V{變數名}(沒有用到過!)

13 處理字型 選中欄位->右鍵->properties->font(雙擊也可以) Report font 選擇全域的字型(僅限於該報表) Font name 選擇在ireport裡面顯示的字型 Pdf font name 選擇在pdf裡面顯示的字型 Rotation 選擇內容是否旋轉(很有用的選項) PDF Encoding 中文要用UniGB-UCS2-H,外部字型要選Identity-H

14 設定該報表的全域字型 預覽->報表字型(view-font)

15 編譯jrxml 建立->編譯 (build-compile) 編譯後產生一個尾碼名為jasper的binary檔案,可以直接給程式調用。

web項目應用

1 jsp輸出PDF報表

 需要放到項目裡的包 itext-1.3.1.jar iTextAsian.jar jasperreports-1.0.1.jar jsp

輸出PDF的例子

{

 

<%@ page import="java.sql.*" %>
 <%@ page import="java.util.*" %>
 <%@ page import="java.io.*" %>
 <%@ page import="net.sf.jasperreports.engine.JasperFillManager"%>
 <%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
 <%@ page import="net.sf.jasperreports.engine.JRException"%>
 <%@ page import="net.sf.jasperreports.engine.JasperRunManager"%>
 <%
  String rowid = "1";//初始設定變數
  Connection conn= DriverManager.getConnection("proxool.test");//從資料來源串連資料庫
  //裝載jasper檔案application
  File exe_rpt = new File(application.getRealPath("/reports/test.jasper"));
  //rowid就是iReport的變數$P{rowid}的名稱
  Map parameters = new HashMap();
  parameters.put("rowid",rowid);
  try{
   // fill
   JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
  
   // 產生pdf
   byte[] bytes = JasperRunManager.runReportToPdf(exe_rpt.getPath(),parameters,conn);
 
   response.setContentType("application/pdf");
   response.setContentLength(bytes.length);
   ServletOutputStream ouputStream = response.getOutputStream();
   ouputStream.write(bytes,0,bytes.length);
   ouputStream.flush();
   ouputStream.close();
   conn.close();
   }catch(JRException ex){
   out.print("Jasper Output Error:"+ex.getMessage());
  }
 %>

}

jsp輸出EXCEL報表

需要放到項目裡的包 jasperreports-1.0.1.jar poi-2.0-final-20040126.jar

輸出excel要注意的:

(1) 輸出excel報表必須fields的邊界剛好填充滿整個頁面,不然會有大量的空白出現。

(2) 刪除記錄最下面的空行需要加上參數 exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE);

(3) 刪除多餘的ColumnHeader需要加上參數 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);

(4) 在ireport裡給fields加上border,那輸出的excel就會有很黑的邊框,跟excel預設的灰階邊框就會很不協調。但是如果不加border,在輸出的excel裡就不會顯示每個表格的邊框。

解決方案是: 第一步 在選中欄位->右鍵->properties->Common->Transparent 打上勾。 第二步 在輸出的jsp頁面加上參數 exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);

2 jsp輸出EXCEL的例子

 

{

<%@ page import="java.sql.*" %>
 <%@ page import="java.util.*" %>
 <%@ page import="java.io.*" %>
 <%@ page import="net.sf.jasperreports.engine.JasperFillManager" %>
 <%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
 <%@ page import="net.sf.jasperreports.engine.JRException"%>
 <%@ page import="net.sf.jasperreports.engine.JRExporterParameter"%>//excel
 <%@ page import="net.sf.jasperreports.engine.export.JRXlsExporterParameter"%>//excel
 <%@ page import="net.sf.jasperreports.engine.export.JRXlsExporter"%>//excel
 <%
  String rowid = "1";
  Connection conn= DriverManager.getConnection("proxool.test");
 
  //裝載jasper檔案application
  File exe_rpt = new File(application.getRealPath("/excel/test_excel.jasper"));
 
  //rowid就是iReport的變數$P{rowid}的名稱
  Map parameters = new HashMap();
  parameters.put("rowid",rowid);
 
  try{
 
   // fill
   JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
  
   // excel輸出
   ByteArrayOutputStream oStream = new ByteArrayOutputStream();
 
    JRXlsExporter exporter = new JRXlsExporter(); 
   
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, oStream);
    exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE); // 刪除記錄最下面的空行
    exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);// 刪除多餘的ColumnHeader
    exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);// 顯示邊框
    exporter.exportReport();
   
    byte[] bytes = oStream.toByteArray();
  
   if(bytes != null && bytes.length > 0) {
    response.reset();
    response.setContentType("application/vnd.ms-excel");
    response.setContentLength(bytes.length);
    ServletOutputStream ouputStream = response.getOutputStream();
    ouputStream.write(bytes,0,bytes.length);
    ouputStream.flush();
    ouputStream.close();
 
   }else{
    out.print("bytes were null!");
   }
   conn.close();
   }catch(JRException ex){
   out.print("Jasper Output Error:"+ex.getMessage());
  }
 %>

 

}

總結 ireport可以顯示圖表,餅圖,曲線圖等,也可以顯示符合報表

 

JasperReports介紹:
   
    使用JasperReports產生報表是非常簡單的,僅僅使用net.sf.jasperreports.engine包中的幾個類即可完成報表的產生、預覽、列印、匯出等各個功能。

1.  net.sf.jasperreports.engine.JasperCompileManager類。
    使用這個類的幾個靜態方法即可完成對報表的編譯工作(具體參見api文檔)
    編譯完成後可以JasperCompileManager有兩種處理方式:
       1> 返回一個JasperReport對象
       2> 在.jrxml檔案所在的目錄產生一個.jasper檔案
    這兩種方式是由程式員自己選擇的。不過我比較傾向使用.jasper檔案,畢竟報表的結構不是每天都在改動,所以每次重新編譯報表並不是很划算。

2.  net.sf.jasperreports.engine.JasperFillManager類
    這個類的作用是用資料填充報表。它可以使用JasperReport對象也可以使用。jasper檔案做為報表範本。
    它同樣有2中處理方式:
          1> 返回一個JsaperPrint對象。
          2> 在.jasper檔案所在目錄產生一個.jrprint檔案
    這個類使用net.sf.jasperreports.engine.JRDataSource介面的實現做為資料來源。任何實現了JRDataSource的類均可做為資料來源使用
    在net.sf.jasperreports.engine.data包中定義了一些資料來源,可根據自己的需要選擇。這裡我使用的是JRTableModelDataSource做為
    資料來源(因為我的報表還要顯示在Table中)。

3. net.sf.jasperreports.engine.JasperPrintManager和net.sf.jasperreports.engine.JasperExportManager
   者兩個類的作用是列印、匯出報表
   他們使用 JasperPrint 和 .jrprint檔案做為輸入。
   可以根據自己的需要使用裡面的方法。

例:
       import net.sf.jasperreports.engine.*;
       import net.sf.jasperreports.view.*;
       public class CompileReport {
          public static void main(String args[]) {
             try {
                //編譯report.jrxml並在report.jrxml所在的目錄中產生report.jasper檔案
                JasperCompileManager.compileReportToFile("report.jrxml");
                //填充資料,這裡使用的是JREmptyDataSource
                JasperFillManager.fillReportToFile("report.jasper", null, new JREmptyDataSource(50));
                //預覽報表,false代表不是使用xml檔案。
                JasperViewer view = new JasperViewer("reports.jrprint", false);
                view.pack();
                view.setVisible(true);
             }
             catch (Exception e) {
                e.printStackTrace()
             }
          }
       }

 

 

 http://www.heci.net 賀詞網!]
JasperReports學習筆記

版本:jasperreports-0.6.7
學習資料來源:http://jasperreports.sourceforge.net

一、    需求(requirements)
JasperReports要用到的工具和類
1. JDK(java開發環境)
  JDK 1.2.2 or higher  
2. XML
  JAXP 1.1 XML Parser(XML解析器)

  Jakarta Commons Digester Component (version 1.1 or later)
  http://jakarta.apache.org/commons/digester/

  Jakarta Commons BeanUtils Component (version 1.1 or later)
  http://jakarta.apache.org/commons/beanutils/

  Jakarta Commons Collections Component (version 1.0 or later)
  http://jakarta.apache.org/commons/collections/

  Jakarta Commons Logging Component (version 1.0 or later)
  http://jakarta.apache.org/commons/logging/
3. JDBC(串連資料庫用)
  JDBC 2.0 Driver
 
4. PDF(轉換為PDF檔案用到)
  iText - Free Java-PDF library by Bruno Lowagie and Paulo Soares
  (version 1.01 or later)
  http://www.lowagie.com/iText/
 
5. XLS(轉換為excel檔案用)
  Jakarta POI (version 2.0 or later)
  http://jakarta.apache.org/poi/

二、快速瞭解(quick how to)
1. Main classes(主要的類)
用JasperReports 時,用到的主要類
 net.sf.jasperreports.engine.JasperCompileManager
 net.sf.jasperreports.engine.JasperFillManager
 net.sf.jasperreports.engine.JasperPrintManager
 net.sf.jasperreports.engine.JasperExportManager
 這些類提供了很多靜態方法,用來編譯、填充、列印和匯出報表。詳細資料請參考JasperReports的javadoc文檔。
 
 net.sf.jasperreports.view.JasperViewer
此類用來預覽產生的報表(generated reports.)。
 
 net.sf.jasperreports.view.JasperDesignViewer
此類用來預覽報表設計(view the report design)。
 
 2. 編譯報表設計Compiling a report design
  xml檔案定義報表設計(report design)。編譯報表設計(report design)產生報表(generate reports)。網頁http://jasperreports.sourceforge.net/quick.how.to.html中介紹用net.sf.jasperreports.engine.JasperCompileManager類的靜態方法compileReportXXX()來編譯報表設計(report design)。但是JasperCompileManager不贊成使用此方法編譯報表設計(report design),推薦使用JasperCompileManager的方法compileReportXXX()來代替。
    編譯報表設計(report design)時,jasperreports engine首先檢查模板,確定是否一致,然後轉換所有的報表運算式(report expressions),最後產生.jasper檔案。    要想使編譯工作儘可能靈活,你可以實現介面net.sf.jasperreports.engine.design.JRCompiler。
    
 3.預覽報表設計 Viewing a report design
  使用net.sf.jasperreports.view.JasperDesignViewer的程式來預覽。他的main()方法接受報表設計檔案名稱(xml)或者編譯後的.jasper檔案。
 
 4. 填充報表 Filling a report
  編譯報表設計(xml檔案)得到報表檔案(.jasper),再調用net.sf.jasperreports.engine.JasperFillManager類的方法fillReportXXX(),可以得到報表(JasperPrint)。
 5. 預覽報表 Viewing a report
  Generated reports can be viewed using the net.sf.jasperreports.view.JasperViewer application.
  In its main() method, it receives the name of the file which contains the report to view.
  我沒有測試成功。
 6. Printing a report
  Generated reports can be printed using the printReport(), printPage() or printPages() static methods exposed by the net.sf.jasperreports.engine.JasperPrintManager class.
 
 7. Exporting to PDF, HTML, XLS, CSV or XML format
  填充報表檔案(.jasper檔案)得到報表(JasperPrint)後,可以使用net.sf.jasperreports.engine.JasperExportManager類的方法exportReportXXX()匯出為各種格式的檔案PDF,HTML,XML。
After having filled a report, we can also export it in PDF, HTML or XML format using the exportReportXXX() methods of the net.sf.jasperreports.engine.JasperExportManager class.

三、JasperReports的工作流程:
 
根據的流程,JasperReports做報表有一下步驟:

1、    報表設計,可以用ireport視覺化檢視來實現,產生xml檔案。完成後,可以直接到步驟3,直接編譯xml檔案。
2、    如果已經存在報表設計檔案(xml檔案),可以用net.sf.jasperreports.engine.xml.JRXmlLoader.load()方法載入報表設計,該方法返回JasperDesign對象,通過JasperDesign對象,可以修改報告設計,比如:添加、刪除欄位,添加、刪除變數,添加、刪除分組,等等。
3、    完成報表設計後,接下來就可以編譯報設計,編譯報表設計可以用類net.sf.jasperreports.engine.JasperCompileManager的compileReport()方法來實現,該方法可以編譯xml檔案或JasperDesign對象,產生JasperReport對象,JasperReport對象可序列化,能夠儲存為檔案(通常是.jasper檔案)。類net.sf.jasperreports.engine.JasperCompileManager還可以把報錶轉化為報表設計檔案(xml檔案)。得到JasperReport對象(可從.jasper檔案執行個體化一個JasperReport對象)後,給報表填充資料產生JasperPrint對象。JasperPrint對象可序列化,儲存為檔案。有了JasperPrint對象後,可以列印、瀏覽、轉換為其他格式的檔案,如:PDF,HTML,XML,XLS,CSV等等,這些操作就是我們想得到的最終結果。儘管JasperPrintManager類可以匯出為PDF,XML檔案,但是不贊成使用JasperPrintManager類來匯出,建議用JasperExportManager類來匯出PDF,HTML,XML檔案;要匯出XLS和CSV檔案,用專業的匯出類net.sf.jasperreports.engine.export.JRXlsExporter類和net.sf.jasperreports.engine.export.JRCsvExporter類
匯出為XLS的程式碼片段:
JRXlsExporter exporter = new JRXlsExporter();//建立執行個體
//設計參數
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, strDestFile);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
exporter.exportReport();//匯出

匯出為CSV檔案和XLS類似。
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.