`
xiongzhenhui
  • 浏览: 205287 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

ireport与jasperreports开发总结

阅读更多


 
一。  下载ireport( 官方网站:http://ireport.sourceforge.net),本人下载ireport3.7.0。

二。  搭建ireport+jasperreports java开发平台。将ireport3.7.0安装路径下
         D:\iReport-3.7.0 \ireport\modules\ext下的(jasperreports-3.7.jar,
         iText-  2.1.0.jar,iTextAsian.jar,commons-logging-1.1.jar,commons-collections-3.2.1.jar,
         commons- digester-1.7.jar,poi-3.2-FINAL-20081019.jar,groovy-all-1.5.5.jar)的jar包加入到 
         java classPath下。其中各jar包的版本以你下载的ireport的\ireport\modules\ext路径下jar为准。

        各jar包作用如下:
        jasperreports-3.7.jar:该包的作用完成ireport中Preview按扭功能。通过该包可以通过java来ireport生成摸班
       (.jrxml或.jasper)填充数据源并导出pdf,excel,html等格式文件。
        iText-2.1.0.jar:生成pdf所依赖的包。
        iTextAsian.jar:支持pdf中文字体依赖的包。
        groovy-all-1.5.5.jar:将.jrxml编译成.jasper.如果你不使用java编译,而使用ireport工具编译则无须导入该 包。
        commons-digester-1.7.jar:解析.jrxml
        poi-3.2-FINAL-20081019.jar:生成excel报表所依赖的jar

三。使用javaBean数据源开发子报表例子如下:

      第一步:创建主报表javaBean(货物)如下(set,get方法省列):

     public class DailySales implements Serializable {
     private static final long serialVersionUID = 1L;

     private String productNo;//货物代号

     private String productName;//货物名称

     private int number;

     private int money;//货物价格

     private int id;//货物唯一标识

     private List<DailyZoom> dailyZooms;//货物销售地区(子报表)

     public DailySales(String productNo, String productName, int number, int money,

     List<DailyZoom>   dailyZooms) {
     this.productNo = productNo;
     this.productName = productName;
     this.number = number;
     this.money = money;
     this.dailyZooms = dailyZooms;
    }

}

   第二步:创建子报表报表javaBean(货物销售地区)如下(set,get方法省列):

  public class DailyZoom implements Serializable {

    private String name;

    private BigDecimal amounts;

    public DailyZoom(String name, BigDecimal amounts) {
    this.name = name;
    this.amounts = amounts;
    }

}

注意:如果在报表中需要排序则上述类必须实现Comparable接口,并实现其方法。

 

  第三步:创建DailySalesFactory工厂类提供集合数据源如下:

       public class DailySalesFactory {
       private static DailySales[] data = { new DailySales(" 货号 1", " 物品1 ", 1, 1000, getDailyZoom()),
       new DailySales(" 货号 2", " 物品 2", 2, 2000, getDailyZoom()),
       new DailySales(" 货号 3", " 物品 3", 3, 3000, getDailyZoom()),
       new DailySales(" 货号 4", " 物品 4", 4, 4000, getDailyZoom()),
       new DailySales(" 货号 5", " 物品 5", 5, 5000, getDailyZoom()),
       new DailySales(" 货号 6", " 物品 6", 6, 6000, getDailyZoom()),
       new DailySales(" 货号 7", " 物品 7", 7, 7000, getDailyZoom()),
       new DailySales(" 货号 8", " 物品 8", 8, 8000, getDailyZoom()),
       new DailySales(" 货号 9", " 物品 9", 9, 9000, getDailyZoom()),
       new DailySales(" 货号 10", " 物品 10", 10, 10000, getDailyZoom()) };

       public static Object[] getBeanArray() {
        return data;
       }

       public static Collection getBeanCollection() {
        return Arrays.asList(data);
       }

      public static List getDailyZoom() {
      List<DailyZoom> dailyZooms = new ArrayList();
     dailyZooms.add(new DailyZoom("厦门", new BigDecimal(123.00)));
     dailyZooms.add(new DailyZoom("南昌", new BigDecimal(456.00)));
     return dailyZooms;
     }
   }

将上述创建的类设置到ireport3.7.0的classPath目录下(工具》选项》classPath),然后配置javaBean数据源如下:

第四步:设定ireport模版如下:



 

 
注意:(1)pdf中文设定:首先将iTextAsian.jar設置到classPath下.然後fonts path下勾選iTextAsian.jar路徑和jasperreports-extensions-3.5.3.jar路徑,最後将会显示中文的文本Pdf Font name is now deprecated:STSong-Light,pdfExcoding:UniGB-UCS2-V (Chinese Simplified)(V是从上往下显示,H是从左往右显示)。
         (2)上下和左右表格要对其,否则生成的excel会很乱。
         (3)Parameters,Fields,Variables区别:Parameters是保存从java外部传进来的参数,Fields是Sql或javaBean数据查询返回的字段,Variables是ireport计算或保存值的。
         (4)分页:强行分页可直接使用Break控件,程序控制分页(让它每显示20条就自动分页)在该print when expression里面写表达式,如下:new Boolean($V{total}.intValue() % 20 == 0)    total是数据总量
         (5)分組統計的報表.每一分組一頁(在ireport中***group foot1勾選start on a new page).
    第五步:使用数据源开发子报表如下:
                
 
 注意:(1)Subreport Expression中$P{SUBREPORT_DIR} + "javaBeanReport_subreport1.jasper"中为子报表编译后文件的路径,其中$P{SUBREPORT_DIR} 是从java中传进子报表路径。
          (2)Data Source Expression:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{dailyZooms})是使用主报表List集合构造子报表JavaBean数据源。

 第五步:从java中加载ireport做好的模板生成报表如下:
     将集合转换成javaBeanDataSource:
     JRBeanCollectionDataSource javaBeanDataSource = new JRBeanCollectionDataSource(results);
     将jrxml编译成jasper:
     JasperReport jasperReport = JasperCompileManager.compileReport("c:/javaBeanReport.jrxml");
     生成JasperPrint对象:
     JasperPrint jasperPrint = JasperFillManager.fillReport
     (jasperReport,parameters,  javaBeanDataSource);parameters为要传如的参数Map对象
      生成pdf流对象:JasperExportManager.exportReportToPdfStream(jasperPrint, stream);

     调用ireport中JasperViewer查看pdf
     JasperViewer jrview = new JasperViewer(jasperPrint);
     jrview.setPreferredSize(new Dimension(200, 100));
     jrview.setVisible(true);
    生成excel代码如下:
    JRXlsExporter exporter = new JRXlsExporter();
    exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, streamExcel);
    exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,  Boolean.FALSE);
    exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
    exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
    exporter.exportReport();
   
    子报表需注意的java代码:
     Map parameters = new HashMap();
     parameters.put("SUBREPORT_DIR", "C:/Documents and Settings/user/桌面/");
     如果有子报表必须从java端将SUBREPORT_DIR参数传给ireport
   
    大量数据内存处理(磁盘建立目录来优化内存):
    JRFileVirtualizer对象如JRFileVirtualizer  virtualizer = new JRFileVirtualizer(2, "tmp");
    然后数据填充时传一个参数即可如:
    Map parameters = new HashMap();
    parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
 
    第六步:显示效果如下:
  

 
         四:与与struts2.0整合(导入struts2-jasperreports-plugin-2.0.12.jar包)
          <packagename="default"namespace="/reports"extends="struts-default,jasperreports-
          default">
         <actionname="demoReport"class="com.xy.report.action.DemoAction">
           <resultname="success"type="jasper">
           <paramname="location">/reports/demoReport.jasper</param>
           <paramname="dataSource">list</param>
           <paramname="format">PDF</param>
           <paramname="reportParameters">map</param>
          </result>
        </action>
       </package>
     </struts>
     location - 提供利用iReport制作编译好的报表文件。
     dataSource - 数据源
     format - 报表输出格式
    reportParameters - 报表参数
  五:常见的异常:
       (1)spring+jasperReport生成PDF格式的报表时报
    java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfWriter.setRgbTransparencyBlending(Z)V异常
    原因:iText.jar文件过旧,将之改为2.1版就没事了。
    (2)java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException异常
       原因:没有导入 groovy-all.jar 包,导入 groovy-all.jar 包就可以了。
    (3)Excle 应用:
       java.lang.NoClassDefFoundError: org/apache/poi/hssf/usermodel/HSSFCellStyle
       出现上述错误提示加入 poi-3.2-FINAL-20081019.jar
    (4)net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font :
       pdfFontName   : STSong-Light
       pdfEncoding   : UniGB-UCS2-H
       isPdfEmbedded : false
       出现上述错误提示加入
       iTextAsian.jar
    (5)java.lang.NoClassDefFoundError: org/apache/commons/digester/Digester
       出现上述错误提示加入 commons-digester-1.7.jar   iReport/lib  功能简述:解析 xml 文件;
    (6)java.lang.NoClassDefFoundError: org/apache/commons/collections/ArrayStack 出现上述错误提示加入
       commons-beanutils-1.7.jar    iReport/lib
    (7)java.lang.NoClassDefFoundError: org/apache/commons/collections/ReferenceMap 出现上述错误提示加入
       commons-collections-2.1.jar   iReport/lib
      
    (8)
     异常:Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components
     解决方法.查看是否在工程目录添加了外部jar [jasperreports-X.X.X.jar],[jasperreports-X.X.X-javaflow.jar]<XXX为版本号>
     如果有同时添加了这两个jar.移除[jasperreports-3.5.3-javaflow.jar] 则可.
   六.ireport其他資料
  • 大小: 28 KB
  • 大小: 64.9 KB
  • 大小: 23.4 KB
  • 大小: 45.4 KB
  • 大小: 14.6 KB
分享到:
评论
2 楼 iris_1992 2015-04-30  
2005年以前,国外开原报表完全碾压国产软件,但是现在国内软件,像帆软、FineBI,都比较牛掰了,设计模式和数据处理方面优于开源报表,真犯不着再用ireport了,
完爆ireport啊
1 楼 rmn190 2012-12-07  
多谢, 试了N多个后, 终于参考您的内容, 设置出来了。

老天开眼啦~~~~~

相关推荐

Global site tag (gtag.js) - Google Analytics