天天看点

扩展_报表_JasperReport简述生命周期模板制作SpringBoot整合

扩展_报表_JasperReport

  • 简述
  • 生命周期
  • 模板制作
  • SpringBoot整合
    • pom.xml
    • Parameters(参数)填充
    • JavaBean 填充
    • 分组报表
    • 图形报表
    • 父子报表

简述

在企业级应用开发中,报表生成、报表打印下载是其重要的一个环节。在之前的课程中我们已经学习了报表中比较 重要的一种:Excel报表。其实除了Excel报表之外,PDF报表也有广泛的应用场景,必须用户详细资料,用户简历 等。接下来的课程,我们就来共同学习PDF报表。

目前世面上比较流行的制作PDF报表的工具如下:

  1. iText PDF:iText是著名的开放项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf 的文档,而且可以将XML、Html文件转化为PDF文件。
  2. Openoffice:openoffice是开源软件且能在windows和linux平台下运行,可以灵活的将word或者Excel转化 为PDF文档。
  3. Jasper Report:是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF

JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者 XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。只需 要将JasperReport引入工程中即可完成PDF报表的编译、显示、输出等工作。 在开源的JAVA报表工具中,JASPER Report发展是比较好的,比一些商业的报表引擎做得还好,如支持了十字 交叉报表、统计报表、图形报表,支持多种报表格式的输出,如PDF、RTF、XML、CSV、XHTML、TEXT、 DOCX以及OpenOffice。 数据源支持更多,常用 JDBC SQL查询、XML文件、CSV文件 、HQL(Hibernate查询),HBase,JAVA集合 等。还允许你义自己的数据源,通过JASPER文件及数据源,JASPER就能生成最终用户想要的文档格式。

生命周期

扩展_报表_JasperReport简述生命周期模板制作SpringBoot整合
  1. 设计阶段(Design):所谓的报表设计就是创建一些模板,模板包含了报表的布局与设计,包括执行计算的 复杂公式、可选的从数据源获取数据的查询语句、以及其它的一些信息。模板设计完成之后,我们将模板保 存为JRXML文件(JR代表JasperReports),其实就是一个XML文件。
  2. 执行阶段(Execution):使用以JRXML文件编译为可执行的二进制文件(即.Jasper文件)结合数据进行执 行,填充报表数据
  3. 输出阶段(Export):数据填充结束,可以指定输出为多种形式的报表

模板制作

Jaspersoft Studio是JasperReports库和JasperReports服务器的基于Eclipse的报告设计器; 它可以作为Eclipse插件 或作为独立的应用程序使用。Jaspersoft Studio允许您创建包含图表,图像,子报表,交叉表等的复杂布局。您可 以通过JDBC,TableModels,JavaBeans,XML,Hibernate,大数据(如Hive),CSV,XML / A以及自定义来源 等各种来源访问数据,然后将报告发布为PDF,RTF, XML,XLS,CSV,HTML,XHTML,文本,DOCX或 OpenOffice。 Jaspersoft Studio 是一个可视化的报表设计工具,使用该软件可以方便地对报表进行可视化的设计,设计结果为格 式.jrxml 的 XML 文件,并且可以把.jrxml 文件编译成.jasper 格式文件方便 JasperReport 报表引擎解析、显示。

下载地址: https://community.jaspersoft.com/community-download

SpringBoot整合

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>6.5.0</version>
    </dependency>
    <dependency>
        <groupId>org.olap4j</groupId>
        <artifactId>olap4j</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.lowagie</groupId>
        <artifactId>itext</artifactId>
        <version>2.1.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>
           

Parameters(参数)填充

Parameters通常是用来在打印的时候从程序里传值到报表里。也就是说parameters通常的是起参数传递的作用。 他们可以被用在一些特定的场合(比如应用中SQL 查询的条件),如report中任何一个需要从外部传入的变量等(如一个 Image对象所包括的char或报表title的字符串)。parameters也需要在创建的时候定义它的数据类型。parameters 的数据类型是标准的java的Object。

(1) 创建新模板,删除不需要的Band

(2)创建Parameter

扩展_报表_JasperReport简述生命周期模板制作SpringBoot整合
扩展_报表_JasperReport简述生命周期模板制作SpringBoot整合
@GetMapping("/testJasper02")
public void createPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {
	// 1.引入jasper文件
	Resource resource = new ClassPathResource("templates/parametersTest.jasper");
	FileInputStream fis = new FileInputStream(resource.getFile());
	// 2.创建JasperPrint,向jasper文件中填充数据
	ServletOutputStream os = response.getOutputStream();
	try {
		/**
		 * 
		 * parameters集合中传递的key需要和设计模板中使用的name一致
		 * 
		 */
		HashMap parameters = new HashMap();
		parameters.put("title", "用户详情");
		parameters.put("username", "李四");
		parameters.put("companyName", plxc");
		parameters.put("mobile", "120");
		parameters.put("departmentName", "讲师");

		JasperPrint print = JasperFillManager.fillReport(fis, parameters, new JREmptyDataSource());
		// 3.将JasperPrint已PDF的形式输出
		JasperExportManager.exportReportToPdfStream(print, os);
		response.setContentType("application/pdf");
	} catch (JRException e) {
		e.printStackTrace();
	} finally {
		os.flush();
	}
}
           

JavaBean 填充

扩展_报表_JasperReport简述生命周期模板制作SpringBoot整合
扩展_报表_JasperReport简述生命周期模板制作SpringBoot整合
//测试javaBean数据源
@GetMapping("/testJasper04")
public void createPdf(HttpServletRequest request, HttpServletResponse response) throws Exception {
	// 1.引入jasper文件
	Resource resource = new ClassPathResource("templates/testJavaBean.jasper");
	FileInputStream fis = new FileInputStream(resource.getFile());
	// 2.创建JasperPrint,向jasper文件中填充数据
	ServletOutputStream os = response.getOutputStream();
	try {
		HashMap parameters = new HashMap();
		// 构造javaBean数据源
		JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(getUserList());
		/**
		 * 1.jasper文件流 2.参数列表 3.JRBeanCollectionDataSource
		 */
		JasperPrint print = JasperFillManager.fillReport(fis, parameters, ds);
		// 3.将JasperPrint已PDF的形式输出
		JasperExportManager.exportReportToPdfStream(print, os);
		response.setContentType("application/pdf");
	} catch (JRException e) {
		e.printStackTrace();
	} finally {
		os.flush();
	}

}

// 一般从数据库查询
public List<User> getUserList() throws Exception {
	List<User> list = new ArrayList<>();
	for (int i = 1; i <= 5; i++) {
		User user = new User(i + "", "testName" + i, "10" + i, "企业" + i, "部门" + i);
		list.add(user);
	}
	return list;
}
           

分组报表

/**
 *  分组报表
 */
@GetMapping("/testJasper5")
public void createPdf(HttpServletRequest request, HttpServletResponse response) throws Exception {
    //1.引入jasper文件
    Resource resource = new ClassPathResource("templates/testGroup.jasper");
    FileInputStream fis = new FileInputStream(resource.getFile());

    //2.创建JasperPrint,向jasper文件中填充数据
    ServletOutputStream os = response.getOutputStream();
    try {
        Map parameters = new HashMap<>();
        //构建javaBean的数据源
        //1.获取到对象的list集合
        List<User> userList = getUserList();
        //2.通过list集合创建javaBean的数据源对象
        JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(userList);
        JasperPrint print = JasperFillManager.fillReport(fis,parameters,ds);
        JasperExportManager.exportReportToPdfStream(print,os);
    } catch (JRException e) {
        e.printStackTrace();
    }finally {
        os.flush();
    }
}

public List<User> getUserList() {
    List<User> list = new ArrayList<>();
    for(int i=0;i<10;i++) {
        User user = new User(i+"", "itcast"+i, "传智播客","讲师", "1380000000"+i);
        list.add(user);
    }
    for(int i=0;i<5;i++) {
        User user = new User(i+"", "itheima"+i, "黑马程序员","讲师", "1380000000"+i);
        list.add(user);
    }

    return list;
}
           

图形报表

/**
     *  charts图形报表
     */
    @GetMapping("/testJasper6")
    public void createPdf(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //1.引入jasper文件
        Resource resource = new ClassPathResource("templates/testCharts.jasper");
        FileInputStream fis = new FileInputStream(resource.getFile());

        //2.创建JasperPrint,向jasper文件中填充数据
        ServletOutputStream os = response.getOutputStream();
        try {
            Map parameters = new HashMap<>();
            //构建javaBean的数据源
            //1.获取到对象的list集合
            List<UserCount> userList = getUserCountList();
            //2.通过list集合创建javaBean的数据源对象
            JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(userList);
            JasperPrint print = JasperFillManager.fillReport(fis,parameters,ds);
            JasperExportManager.exportReportToPdfStream(print,os);
        } catch (JRException e) {
            e.printStackTrace();
        }finally {
            os.flush();
        }
    }

    public List<UserCount> getUserCountList() {
        List<UserCount> list = new ArrayList<>();

        UserCount uc1 = new UserCount("传智播客",1000l);
        UserCount uc2 = new UserCount("黑马程序员",1000l);
        UserCount uc3 = new UserCount("baidu",1000l);
        list.add(uc1);
        list.add(uc2);
        list.add(uc3);
        return list;
    }
           

父子报表

/**
 *  父子报表
 */
@GetMapping("/testJasper7")
public void createPdf(HttpServletRequest request, HttpServletResponse response) throws Exception {
    //1.引入jasper文件
    Resource resource = new ClassPathResource("templates/main01.jasper");
    FileInputStream fis = new FileInputStream(resource.getFile());

    //2.创建JasperPrint,向jasper文件中填充数据
    ServletOutputStream os = response.getOutputStream();
    try {
        Map parameters = new HashMap<>();
        //参数  子报表的路径   子报表需要的数据
        Resource subResout = new ClassPathResource("templates/testCharts.jasper");
        parameters.put("sublist",getUserCountList());//子报表需要的数据
        parameters.put("subpath",subResout.getFile().getPath());// 子报表的路径

        JasperPrint print = JasperFillManager.fillReport(fis,parameters,new JREmptyDataSource());
        JasperExportManager.exportReportToPdfStream(print,os);
    } catch (JRException e) {
        e.printStackTrace();
    }finally {
        os.flush();
    }
}

public List<UserCount> getUserCountList() {
    List<UserCount> list = new ArrayList<>();

    UserCount uc1 = new UserCount("传智播客",1000l);
    UserCount uc2 = new UserCount("黑马程序员",1000l);
    UserCount uc3 = new UserCount("baidu",1000l);
    list.add(uc1);
    list.add(uc2);
    list.add(uc3);
    return list;
}