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/

DynamicJasper入门的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  3. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  4. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  5. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  6. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  7. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  8. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  9. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

随机推荐

  1. Python3.5 学习四

    装饰器 定义:本质是函数,装饰其他函数,即为其他函数添加附加功能的 原则: 1 不能修改被装饰函数的源代码 2 不能改变被装饰函数的调用方式(对于被装饰函数来说完全透明,不会受影响) 实现装饰器功能的 ...

  2. linux - 【LAMP环境配置安装注意安装步骤】 9

    (一)安装gcc glibc-devel glibc-headers ==>依赖项 kernel-headers ==>依赖项 libgomp gcc-c++ libstdc++-deve ...

  3. 【OCP-12c】2019年CUUG OCP 071考试题库(73题)

    73.Which statement correctly grants a system privilege? A. GRANT CREATE VIEW ON table1 TO user1; B. ...

  4. Windows 计划任务之消息提醒

    Windows 计划任务之消息提醒 你肯定也有这种需求.想做一个计划任务,却发现老式消息提醒已经被微软禁止了. 或者就是很单纯的希望给系统弹出一个消息框而并非CMD的echo命令. so...how ...

  5. C#-WebForm-组合查询(Queryable延迟查询、Intersect交集)、分页展示基础

    组合查询: 方法一:Queryable<> 延迟查询 其特点是:读到词句代码时不会立即执行,而是在进行数据绑定时执行 优点:此期间可以进行添加查询条件,以减少数据库查询内容,来减少内存占用 ...

  6. CSS02--四种样式、背景、文本、链接状态、表格样式

    接上面的“CSS01”,我们接着来说一下样式.很多人不知道的是一个HTML元素有四种样式,分别是浏览器默认样式.外部样式.内部样式.内联样式,而它们的优先级是越来越高的,后面的样式会覆盖前面的样式.多 ...

  7. SQL语句01

    SQL(Structured Query Language):结构化查询语言 SQL分类:    数据操纵语言DML(Data Manipulation Language)        SELECT ...

  8. Polycarp Restores Permutation

    http://codeforces.com/contest/1141/problem/C一开始没想法暴力的,next_permutation(),TLE 后来看了这篇https://blog.csdn ...

  9. 20190417 CentOS 7下安装ActiveMQ

    前言 用VMware安装CentOS 7.6,创建一个新的用户lihailin9073,并使用这个用户登陆CentOS系统 安装和启动 登陆ActivieMQ官网http://activemq.apa ...

  10. javascript004引用类型

    –掌握数组的概念.特性.常用方法(重点) –掌握Object,学会使用对象(重中之重) –了解其他引用类型对象 一:数组 •在ECMAScript中数组是非常常用的引用类型了.ECMAScript所定 ...