用JasperReport+iReport進行Web報表開發
序言 在非常多實際的項目里,報表都是當中十分重要的組成部分,比如把查詢結果以報表的形式呈現出來。這里所提到的報表可不是簡單的二維表,而是擁有復雜表頭的、多維的、能夠在執行期從數據庫中自己主動讀取數據、可自己主動分頁、擁有豐富的頁面元素(圖片,超連接等)、支持分組和交叉表、支持打印、最好還能導出到Excel或Word…...(汗L)。可是顯而易見,報表功能越強大,提供的服務越豐富,其復雜度也就越提高,所以僅靠石器時代的手工方式生成報表是不能滿足須要的。所幸,眼下我們所熟知的幾款報表工具功能上足夠強大,并且都附有非常方便的報表生成工具。它們各自是:JasperReport(+iReport),BIRT(+eclipse),水晶報表(+eclipse,JBuiler等等)。 之所以提到這三種報表工具首先是由于他們都是開放源代碼的(CrystalReportForEclipse1.0已經開源了)。既然不用考慮費用,那在我們的項目中究竟選用哪一個呢?對于水晶報表而言,盡管其在.Net平臺上表現十分搶眼,可是在Java平臺上,多數的實現都是要收費的(比如For JBuilder版),并且其Eclipse插件的資源消耗十分驚人(我的機器配置為P
4 3.0+512RAM,使用“Eclipse3.2+水晶報表插件”根本就跑不動)。所以我選擇了純Java的報表工具JasperReport與iReport的組合。可是關于JasperReport的文檔相對匱乏,其官方文檔還是要收費的,所我希望利用這篇文章展示怎樣利用這一強力組合來進行基于Web的報表開發,希望能為那些苦于報表的同仁們解決一些實際問題。 本文將火力集中在怎樣在Web環境下配置和使用JasperReport報表和報表的導出功能等方面,因為在曾經的Blog中我已經寫過怎樣設計普通的報表,所里這里將不再贅述。對于那些主要的操作則留給讀者自行體會,相信在iReport的幫助下,上手會非常快的。
(注:本文已被《程序猿》收錄,未經同意不得轉載)
1
???? JasperReport簡單介紹 2
???? Web報表開發 2.1
????? 環境設置 2.2
????? 報表預覽框架 2.3
????? 使用JNLP技術實現client預覽 3
???? 結束語... 24
1?? JasperReport簡單介紹 JasperReport是一個強大、靈活的報表生成工具,能夠展示豐富的頁面內容,并將之轉換成PDF,HTML,XML,Excel(通過POI或JExcelAPI實現)和Rtf(通過POI實現)格式。該庫全然由Java寫成,能夠用于在各種Java應用程序,包含J2EE,Web應用程序中生成動態內容。它的主要目的是輔助生成面向頁面的(page oriented),準備付諸打印的文檔。JasperReport借由定義于XML文檔中的report design進行數據組織。這些數據可能來自不同的數據源,包含關系型數據庫,collections,java對象數組。通過實現簡單的接口,用戶就能夠將report library插入到訂制好的數據源中。用JasperReport進行報表開發的步驟例如以下所看到的(Version=1.0):
眼下JasperReport最新的版本號是1.2.7,能夠到Sourceforg站點下載其整個project及代碼。其project文件文件夾下的demo子文件夾中包括非常多定義良好的樣例,能夠實現各種所需功能。鑒于它的文檔收費,想學習使用JasperReport的話我們也僅僅能以這些demo作為學習資料了。 可是繁瑣的XML標記和功能API在提供強大的動態及可擴展開發的同一時候也帶來了超高的復雜性,在沒有免費文檔的情況下,手工編寫報表設計所需的XML文件是極其不明智的。只是正如我們用JBuilder(或其它可視化開發工具)編寫SwingGUI時一樣,我們能夠採用iReport進行可視化的報表設計來避免和可怕的XML文件及實現細節打交道。盡管可能會損失一些動態生成報表的靈活性,可是大多數情況下,我們僅僅須要靜態的設計框架和動態的裝填數據而非常少須要動態的報表框架,所以和我們所獲得的方便相比,這些小小的損失簡直能夠忽略不計了。當然假設確實須要,且看到以下的東西你不暈的話,自己動手確實能夠獲得所需的靈活性。 當中的VerticalFilling和HorizontalFilling表示裝填數據的順序。從上圖我們能夠清楚地看到,一個報表的設計主要由PageHeader和報表內容組成,報表內容又是由列組成,內容既能夠是一列也能夠是多列,還能夠是Group。詳細的實比例如以下: 這些元素究竟在JaserReport的XML設計文件里的定義為何我并不想關心,由于這都由iReport負責擔心了,我們僅僅需輕松的像搭積木一樣利用iReport加入各種可視化元素就能夠了。相信用過之后你會對iReport愛不釋手,就像我一樣。出于實際須要,我會提供一個簡單的動態表單的生成框架供各位參考。?
2?? Web報表開發 現今的環境是Web大行其道,一個工具假設不能融入Web功能就無法立足。JasperReport的開發人員顯然非常早就意識到了這一點,所以在JasperReport1.0曾經就增加了支持Servlet/JSP的能力。也就是說,我們能夠利用Servlet/JSP將生成好的報表導出成HTML(或PDF/RTF/EXCEL)格式供預覽或導出之用。然而唯一的缺憾在于JasperReport并未提供在client直接打印的功能,而除了使用Applet之外我們又不能直接在client顯示JRViewer這種預覽窗體,怎樣解決這些問題呢?
2.1環境設置 在Servlet/JSP中使用JasperReport無需很多其它的設置,僅僅須要將JasperReport所用到的jar包放入project中的WEB-INF/lib文件夾下就可以。在程序執行期,Servlet/JSP僅僅需可以正確載入報表文件,裝填數據并生成JasperPring對象,利用我以下給出的導出框架稍加改動就可以生成一個帶有HTML/PDF/RTF/EXCEL導出功能以及可將HTML預覽進行分頁的功能模塊。
2.2報表預覽框架 <%@page contentType="text/html; charset=UTF-8"%> <%@page import="javax.servlet.*"%> <%@ page import="net.sf.jasperreports.engine.*" %> <%@ page import="net.sf.jasperreports.engine.util.*" %> <%@ page import="net.sf.jasperreports.engine.export.*" %> <%@ page import="net.sf.jasperreports.j2ee.servlets.*" %> <%@ page import="java.util.*" %> <%@ page import="java.io.*" %> <%
JasperPrint jasperPrint = (JasperPrint)session.getAttribute("JasperPrint"); ?session.setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,jasperPrint); String pageTitle = (String)session.getAttribute("pageTitle"); JRHtmlExporter exporter = new JRHtmlExporter(); int pageIndex = 0; int lastPageIndex = 0; if (jasperPrint.getPages() != null){ lastPageIndex = jasperPrint.getPages().size() - 1; } String pageStr = request.getParameter("pageIndex"); try{ if( pageStr != null) pageIndex = Integer.parseInt(pageStr); }catch(Exception e){ //e.printStackTrace(); } if (pageIndex < 0){ pageIndex = 0; } if (pageIndex > lastPageIndex){ pageIndex = lastPageIndex; } StringBuffer sbuffer = new StringBuffer(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER, sbuffer); exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "ImageServlet?image="); exporter.setParameter(JRExporterParameter.PAGE_INDEX, new Integer(pageIndex)); exporter.setParameter(JRHtmlExporterParameter.HTML_HEADER, ""); exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, ""); exporter.setParameter(JRHtmlExporterParameter.HTML_FOOTER, ""); try{ exporter.exportReport(); }catch(Exception e){ e.printStackTrace(); } %> 這部分代碼用于將Servlet生成的JasperReport對象導出成HTML格式,導出所用的Servlet為JasperReport自帶的ImageServlet。要特別注意的是我加了顏色部分的代碼,即一定要向Session變量中放入一個JasperPrint對象,其keyword為“
ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE”,這樣ImageServlet就能夠獲取并自己主動導出報表了。 <html> <head> <title><%=pageTitle %></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="CSS/style.css"> </head> <body> <table class="titleBarT"> <tr> <td>??????? >> <%=pageTitle %> </td> </tr> </table> <table width="98%" cellpadding="0" cellspacing="0" border="0" height="22"> <tr> <td>??????? <div class="menu"><a href="PdfServlet"><img src="Images/pdf.gif" border="0"></a></div> <div class="menu"><a href="RtfServlet"><img src="Images/word.gif" border="0"></a></div> <div class="menu"><a href="XlsServlet"><img src="Images/excel.gif" border="0"></a></div> <div class="menu"><a href=""> </a></div> <div> <% if (pageIndex > 0) { %> <a href="本頁?pageIndex=0"><img src="Images/FirstPage.gif" border="0"></a> <a href="本頁?pageIndex=<%=pageIndex - 1%>"><img src="Images/PreviousPage.gif" ></a> <% } else { %> <img src="Images/FirstPage_disabled.gif" border="0"/> <img src="Images/PreviousPage_disabled.gif" border="0"/> <% } if (pageIndex < lastPageIndex) { %> <a href="本頁?pageIndex=<%=pageIndex + 1%>"><img src="Images/NextPage.gif" ></a> <a href="本頁?pageIndex=<%=lastPageIndex%>"><img src="Images/LastPage.gif" ></a> <% } else { %> <img src="Images/NextPage_disabled.gif" border="0"> <img src="Images/LastPage_disabled.gif" border="0"> <% } %> </div> </td> </tr> </table>
這段代碼是將導出成HTML的報表進行分頁顯示。 <table width="98%" cellpadding="0" cellspacing="0" border="0"> <tr> <td width="50%"> </td> <td align="left"> <%=sbuffer.toString()%> </td> <td width="50%"> </td> </tr> </table> </body> </html> 這里導出報表內容的代碼。用Tomcat作為WebContainer,顯示的結果例如以下:
利用這個框架我們能夠輕易的實現自己主動分頁的功能并將報表導出成我們想要的格式:如PDF,Word,Excel的等。 限于篇幅,這里我不可以展現報表開發的每個細節和過程,可是我已經盡量將Web報表開發的大概過程提取出來,并著重介紹數據源的設制,交叉表的設計,以及Web預覽框架這些相信每個做Web報表的人都會遇到的問題及其解決方式,在JasperReport的高端使用文檔相對匱乏的情況下,希望我的努力能給你帶來一點幫助。
轉載于:https://www.cnblogs.com/mengfanrong/p/3809958.html
總結
以上是生活随笔為你收集整理的利用JasperReport+iReport进行Web报表开发的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。