用cewolf,ireport+jasperReport进行图表,报表的打印

    技术2022-05-11  81

    前一段时间,我在工作中我使用了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+j asperReport实现 报表打印。    我们现在 iReport中编辑 报表的格式,这样生成了一个 xml或jr xml 文件(其实也是 xml格式的),    编辑完毕后,编译会生成一个*.j asper 文件。当然,也可以放在 服务器端,在执行 程序时,将    其编译,但这样会影响速度,好处是兼容性比较好。     实现 报表打印有两方式:         a. 先生成 报表,再将 报表传送给客户端;            特点:开始时速度比较快,可是随着时间的变化, 服务器端会有大量的冗余 文件                   某些浏览器不支持时,会出错。         b. 再 服务器端不生成 报表,在客户端动态生成 报表传给客户端。             特点: 请求时处理量较大。                    1.以pdf格式打印 报表;       在 iReport中选中已pdf格式打印的字体; <%        File reportFile = applic ant.getPath("/PDFReport/operationStatDisplay.j asper");        //定位编译后的j asper 文件;        System.out.println(reportFile.getPath()+" ------This is the j asper file path.");        Map parameters = new HashMap();        PnrOperationLog operationLog = new PnrOperationLog();        parameters.put("ReportTitle", "订座操作量统计:"+operationType+"(按"+Type+"显示)"); //加上参数        JRBeanArrayDataSource jrDataSource = new JRBeanArrayDataSource(BookUtil.getObjectArrayFromArrayList(bList));        byte[] bytes = J asperRunManager.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为要打印的实体数组; J asperPrint j asperPrint =     J asperFillManager.fillReport(        reportFile.getPath(),        parameters,        jrDataSource        ); JRHtmlExporter exporter = new JRHtmlExporter(); Map imagesMap = new HashMap(); session.setAttribute("IMAGES_MAP", imagesMap); exporter.setParameter(JRExporterParameter.JASPER_PRINT, j asperPrint); exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap); exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "/servlet/reports.Image?image="); exporter.setParameter(JRExporterParameter.JASPER_PRINT, j asperPrint); 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等之类。 

    最新回复(0)