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

前一段时间,我在工作中我使用了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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值