报表打印

前一段时间,我在工作中我使用了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等之类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值