|
|
前一段时间,我在工作中我使用了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等之类。 相关参考: http://sourceforge.net/(查找cewolf,iReport,japserReport即可) 总之,对于图表的混排,嵌套,主从表,图片支持,条形码,行,段动态显示,翻页,中文,行,段,页的运算等均需注意。 这些也会越说越多。报表的工具也很多,如displayTag,**报表等等,如果想和我一起探讨,请和我联系!附件:1112002234992cewolfjsessionidCH82F65dHK1tG4unyUbh5JTQwOFuNNGUAt124Fv9omZTvT0ZnylN4867810851111997558033.png(12K) ![[java]](/faces/60.gif) |
|