報表打印

前一段時間,我在工作中我使用了Apache的開源產品來進行圖表,報表的打印工作。以下只是比較
實用的打印方式,其實,該產品中的doc對使用說得已經是很詳細了。我之所以寫這篇文章,是想和初
學者分享我的一點經驗,避免大家少走彎路。

一.用cewolf實現圖表打印;(注意刷新問題)
1.打印出柱狀圖;
該程序主要爲兩個步驟:
a.實現DatasetProducer接口;
b.在cewolf標籤中調用該匿名類,添好相關屬性;
以下爲重要片斷:
<%
ArrayList list = null;
Date[] dates=null;
list = (ArrayList)session.getAttribute(SessionNames.OPERATION_STAT);
PnrOperationLog operationLog = null;
PnrOperationLog[] operationLogs = null;
for (int i=0;i<list.size();i++){
operationLog = (PnrOperationLog)list.get(i);
operationLogs[i] = operationLog;
dates[i]=DateTimeFormatUtil.cnFormatToDate(operationLogs[i].getOperateDate());
%>
<tr>
<td align="center"><%=i+1%></td>
<td align="center"><%=operationLog.getOperateDate()%></td>
<td align="center"><%=operationLog.getOperateStat()%></td>
</tr>
<%}
final ArrayList listN=list;
final PnrOperationLog[] operationLogsN=operationLogs;
final Date[] datesN=dates;
if (pageContext.getAttribute("initFlag") == null) {
DatasetProducer timeData = new DatasetProducer() {
public Object produceDataset(Map params) {
TimeSeries ts = new TimeSeries("Cewolf Release Schedule", Month.class);
for (int i=0;i<listN.size();i++){
ts.add(new Month(datesN[i].getMonth(), datesN[i].getYear()), operationLogsN[i].getOperateStat());
}
return new TimeSeriesCollection(ts);
}
public String getProducerId() {
return "TimeDataProducer";
}
public boolean hasExpired(Map params, Date since) {
return false;//更據返回值false或true決定是否對其刷新;
}
};
pageContext.setAttribute("timeData", timeData);
}
%>
</table>
<table border=0>
<TR>
<TD>
colorpaint<BR>
<cewolf:chart id="timeChart" title="TimeSeries" type="timeseries">
<cewolf:colorpaint color="#EEEEFF"/>
<cewolf:data>
<cewolf:producer id="timeData"/>
</cewolf:data>
</cewolf:chart>
<cewolf:img chartid="timeChart" renderer="cewolf" width="300" height="300"/>
</TD>
</TR>
</TABLE>
<%}
catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html:html>
2.打印曲線圖;
由於數據源不變,只需要調用cewolf的標籤即可,如下:
<table border=0>
<TR>
<TD>
<cewolf:overlaidchart
id="test2"
title="曲線圖"
type="overlaidxy"
xaxistype="date"
yaxistype="number"
xaxislabel="時間"
yaxislabel="統計量">
<cewolf:colorpaint color="#AAAAFFEE"/>
<cewolf:plot type="xyverticalbar">
<cewolf:data>
<cewolf:producer id="xy1" />
</cewolf:data>
</cewolf:plot>
</cewolf:overlaidchart>
<cewolf:img chartid="test2" renderer="/cewolf" width="500" height="300"/>
</TD>
</TR>
</TABLE>
3.其他類型的圖,數據源不變,只需要調用cewolf相應的標籤即可。

二.用iReport+jasperReport實現報表打印。
我們現在iReport中編輯報表的格式,這樣生成了一個xml或jrxml文件(其實也是xml格式的),
編輯完畢後,編譯會生成一個*.jasper文件。當然,也可以放在服務器端,在執行程序時,將
其編譯,但這樣會影響速度,好處是兼容性比較好。
實現報表打印有兩方式:
a. 先生成報表,再將報表傳送給客戶端;
特點:開始時速度比較快,可是隨着時間的變化,服務器端會有大量的冗餘文件
某些瀏覽器不支持時,會出錯。
b. 再服務器端不生成報表,在客戶端動態生成報表傳給客戶端。
特點: 請求時處理量較大。
1.以pdf格式打印報表;
在iReport中選中已pdf格式打印的字體;
<%
File reportFile = applicant.getPath("/PDFReport/operationStatDisplay.jasper");
//定位編譯後的jasper文件;
System.out.println(reportFile.getPath()+" ------This is the jasper file path.");
Map parameters = new HashMap();
PnrOperationLog operationLog = new PnrOperationLog();
parameters.put("ReportTitle", "訂座操作量統計:"+operationType+"(按"+Type+"顯示)"); //加上參數
JRBeanArrayDataSource jrDataSource = new JRBeanArrayDataSource(BookUtil.getObjectArrayFromArrayList(bList));
byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, jrDataSource);
response.setContentType("application/pdf");
//response.setContentLength(bytes.length);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(bytes,0,bytes.length);
outputStream.flush();
outputStream.close();
%>
2.以html格式打印報表;
注意圖片的插入(JRHtmlExporterParameter.IMAGES_MAP);
翻頁的處理(style='page-break-before:always;);
注意該方式不同於直接已html形式打印出報表。
JRBeanArrayDataSource jrDataSource = new JRBeanArrayDataSource(objects);//objects爲要打印的實體數組;
JasperPrint jasperPrint =
JasperFillManager.fillReport(
reportFile.getPath(),
parameters,
jrDataSource
);
JRHtmlExporter exporter = new JRHtmlExporter();
Map imagesMap = new HashMap();
session.setAttribute("IMAGES_MAP", imagesMap);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);
exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "/servlet/reports.Image?image=");
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "<br style='page-break-before:always;'>");
//exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.TRUE);
exporter.exportReport();
out.flush();
out.close();
%>
3.已其他形式打印出報表於以上類似,只是實現的接口或繼承的類不同。
以上開源的產品真的不錯,基本上要實現的功能都可以實現,版本有在完善中,他們的底層也是
jfree,iText等之類。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章