zoukankan      html  css  js  c++  java
  • DynamicJasper入门

    JasperReport

    在了解DynamicJasper之前不得不先了解一下jasperReport,jasperReport是基于Java的一个开源的报表工具,它使得你可以在Java环境下像其它的IDE中一样生成报表,它是当前Java开发者中最常用的报表工具

    简单来说,jasperReport是一个在Java程序中生成报表的工具,支持PDF、Html、Excel等格式。

    官网:https://community.jaspersoft.com/

    要使用JasperReport,你需要做几件事:

    1、设计报表模板文件.jrxml

    2、编译报表模板.jasper

    3、给模板填充数据

    4、导出报表成文件

    我们看到,在填充数据之前我们需要设计一个报表的模板,并且把这个模板编译成.jasper文件,设计模板可以使用如IReport或者JasperSoft Studio等设计器来进行可视化设计。而后,我们的程序中会加载这个.jasper编译文件,并给他填充数据最后导出为报表文件。

    但是我们可以轻易得发现这个过程存在很多不方便的地方,如:为了设计这个模板,我必须去学会如何使用设计器,增加了我的学习成本;编译好的模板,在程序中不方便修改结构,很多情况下我非常希望模板是动态设计、编译的而不是一个固化的编译文件。这些问题的存在,也就促使DynamicJasper这个东西产生了。

    DynamicJasper

    DynamicJasper中文直译为动态的Jasper,它的意义直接表明了它的存在是为了动态的创建Jasper。官网上介绍DynamicJasper的时候说:“它是一个为了隐藏jasperReport模板设计的复杂性而存在的API”。所以,引入DynamicJasper可以让你通过编写代码的方式来设计模板,从而达到动态创建的效果。

    官网:http://dynamicjasper.com/

    要使用DynamicJasper你只需要引入依赖:

    <dependency>
      <groupId>ar.com.fdvs</groupId>
      <artifactId>DynamicJasper</artifactId>
      <version>5.1.1</version>
    </dependency>

    上文中我们提到过,JasperReport在填充数据前需要设计和编译出模板,那么DynamicJasper的作用在于动态地创建模板,所以对于如何使用DynamicJasper我们大概可以猜测到做的事情:

    1、构建一个DynamicJasper

    2、将DynamicJasper转换成JasperReport

    3、填充数据

    4、导出文件

    代码示例

    根据上面罗列的4个步骤,我们从代码的角度看看如何使用它(文章最后会有完整的代码贴出):

    1、构建一个DynamicJasper,我们这里通过一个FastReportBuilder来构建一个DynamicReport

    FastReportBuilder builder = new FastReportBuilder();
    builder.addColumn("ID", "id", Integer.class.getName(), 30)
           .addColumn("NAME", "name", String.class.getName(), 30)
           .addColumn("AGE", "age", Integer.class.getName(), 30)
           .setTitle("DynamicReport测试")
    DynamicReport dynamicReport = builder.build();

    2、将DynamicReport转换成JasperReport

    JasperReport jasperReport = DynamicJasperHelper.generateJasperReport(dynamicReport, new ClassicLayoutManager(), null);

    3、填充数据,这里简单地通过模拟数据的方式创建了一个数据源,并填充到了jasperReport里面

    // 模拟数据
    List<Map<String, Object>> persons = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        Map<String, Object> person = new HashMap<>();
        person.put("id", 1);
        person.put("name", "lay");
        person.put("age", 25);
        persons.add(person);
    }
    // 创建数据源
    JRDataSource jrDataSource = new JRBeanCollectionDataSource(persons);
    // 填充数据
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, jrDataSource);

    4、导出文件,这里演示导出为Html文件,通过jasperPrint的输入流,输出到本地C盘目录下的testHtml.html输出流当中(注意:JasperReport不支持中文,所以如果你导出为PDF中文会不显示,你可以下载源代码增加中文字体并重新打包jar文件然后引入项目,本文不扩展讲解)。

    // html
    HtmlExporter htmlExporter = new HtmlExporter();
    htmlExporter.setExporterInput(new SimpleExporterInput(jasperPrint));
    htmlExporter.setExporterOutput(new SimpleHtmlExporterOutput(new FileOutputStream(new File("C://Users/admin/Desktop/testHtml.html"))));
    htmlExporter.exportReport();

    最终你会看到一个如图的报表文件:

    完整代码

    下面贴出了完整的代码,可以从main方法开始阅读,代码按照上面的步骤编写。

    import ar.com.fdvs.dj.core.DynamicJasperHelper;
    import ar.com.fdvs.dj.core.layout.ClassicLayoutManager;
    import ar.com.fdvs.dj.domain.DynamicReport;
    import ar.com.fdvs.dj.domain.Style;
    import ar.com.fdvs.dj.domain.builders.FastReportBuilder;
    import ar.com.fdvs.dj.domain.constants.Font;
    import ar.com.fdvs.dj.domain.constants.HorizontalAlign;
    import net.sf.jasperreports.engine.*;
    import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
    import net.sf.jasperreports.engine.export.HtmlExporter;
    import net.sf.jasperreports.engine.export.JRPdfExporter;
    import net.sf.jasperreports.export.SimpleExporterInput;
    import net.sf.jasperreports.export.SimpleHtmlExporterOutput;
    import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author lay
     * @date 2018/10/26 18:00
     */
    public class DynamicReportTest {
    
        private DynamicReport dynamicReport;
    
        private JasperReport jasperReport;
    
        private JRDataSource jrDataSource;
    
        private JasperPrint jasperPrint;
    
        public static void main(String[] args) throws Exception {
            new DynamicReportTest().buildDynamicReport()
                                   .generateJasperReport()
                                   .fillDataSource()
                                   .export();
        }
    
        /**
         * 构建DynamicJasper
         * @return
         * @throws ClassNotFoundException
         */
        public DynamicReportTest buildDynamicReport() throws ClassNotFoundException {
            FastReportBuilder builder = new FastReportBuilder();
            Style style = new Style();
            style.setHorizontalAlign(HorizontalAlign.CENTER);
            builder.addColumn("中文", "id", Integer.class.getName(), 30, style)
                   .addColumn("姓名", "name", String.class.getName(), 30, style)
                   .addColumn("年龄", "age", Integer.class.getName(), 30, style)
                   .setTitle("DynamicReport测试")
                   .setUseFullPageWidth(true)
                   .setPrintBackgroundOnOddRows(true);
            dynamicReport = builder.build();
            return this;
        }
    
        /**
         * 生成JasperReport
         * @return
         * @throws JRException
         */
        public DynamicReportTest generateJasperReport() throws JRException {
            jasperReport = DynamicJasperHelper.generateJasperReport(dynamicReport, new ClassicLayoutManager(), null);
            return this;
        }
    
        /**
         * 填充数据源
         * @return
         * @throws Exception
         */
        public DynamicReportTest fillDataSource() throws Exception {
            // 模拟数据
            List<Map<String, Object>> persons = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                Map<String, Object> person = new HashMap<>();
                person.put("id", 1);
                person.put("name", "张三");
                person.put("age", 25);
                persons.add(person);
            }
            // 创建数据源
            jrDataSource = new JRBeanCollectionDataSource(persons);
            // 填充数据
            jasperPrint = JasperFillManager.fillReport(jasperReport, null, jrDataSource);
            return this;
        }
    
        /**
         * 导出为Html文件
         * @throws Exception
         */
        public void export() throws Exception {
            // html
            HtmlExporter htmlExporter = new HtmlExporter();
            htmlExporter.setExporterInput(new SimpleExporterInput(jasperPrint));
            htmlExporter.setExporterOutput(new SimpleHtmlExporterOutput(new FileOutputStream(new File("C://Users/admin/Desktop/testHtml.html"))));
            htmlExporter.exportReport();
        }
    }

    补充说明

    上面的示例只是为了演示而快速创建,如果需要更多自定义功能可以参考官方的Getting Started:http://dynamicjasper.com/documentation-examples/getting-started/

    另外DynamicJasper还支持图表、交叉报表、子报表、Html等更多强大的功能,你可以参考How To来深入了解:http://dynamicjasper.com/documentation-examples/how-to-2/

  • 相关阅读:
    效率神器-uTools推荐和使用
    sqlserver数据库脱机和分离的区别
    JS "&&"操作符妙用
    小程序图片添加视频播放按钮图标
    js将秒数转换为时分秒格式
    分享一波技术党适合做浏览器首页的网站
    Coursera课程笔记----C++程序设计----Week7
    Coursera课程笔记----C++程序设计----Week6
    Coursera课程笔记----C++程序设计----Week5
    Coursera课程笔记----C++程序设计----Week4
  • 原文地址:https://www.cnblogs.com/lay2017/p/9859340.html
Copyright © 2011-2022 走看看