当前位置: 首页 > news >正文

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/

 

转载于:https://www.cnblogs.com/lay2017/p/9859340.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 更大,还是更快:Savvio 10K.2和Savvio 15K.1
  • 学以致用二十七-----Centos7.5二进制安装mysql5.7.23
  • DNN中的Skinning系统
  • nginx知识总结
  • 关于外键约束和对应主键信息的查询脚本
  • struts2知识复习之二
  • 将链表逆序(Revert)的C#实现
  • 高中数学中需要重点关注的函数和图像
  • 如何实现DES算法
  • TensorFlow系列专题(三):深度学习简介
  • top命令解析
  • Tensorflow 笔记
  • 经典总结:PERL中用DBD:ORACLE模块的权限问题
  • 许昌五女店考场考试安排
  • perl链接数据库实例
  • 345-反转字符串中的元音字母
  • django开发-定时任务的使用
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript标准库系列——Math对象和Date对象(二)
  • jdbc就是这么简单
  • leetcode388. Longest Absolute File Path
  • Material Design
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • nodejs实现webservice问题总结
  • rabbitmq延迟消息示例
  • Swift 中的尾递归和蹦床
  • ubuntu 下nginx安装 并支持https协议
  • 给初学者:JavaScript 中数组操作注意点
  • 那些被忽略的 JavaScript 数组方法细节
  • 驱动程序原理
  • 学习JavaScript数据结构与算法 — 树
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • python最赚钱的4个方向,你最心动的是哪个?
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $L^p$ 调和函数恒为零
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (MATLAB)第五章-矩阵运算
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转) Android中ViewStub组件使用
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .gitignore
  • .net 调用php,php 调用.net com组件 --
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net网站发布-允许更新此预编译站点
  • .Net语言中的StringBuilder:入门到精通
  • .NET中winform传递参数至Url并获得返回值或文件
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化