JasperReport框架制作PDF报表

JasperReport框架制作PDF报表

1. PDF报表概述

1.1 概述

在企业级应用开发中,报表生成、报表打印下载是其重要的一个环节。除了Excel报表之外,PDF报表也有广泛的应用场景。

1.2 JasperReport框架的介绍

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

1.3 JasperReport的开发步骤

通常我们提到PDF报表的时候,浮现在脑海中的是最终的PDF文档文件。在JasperReports中,这只是报表生命周期的最后阶段。通过JasperReports生成PDF报表一共要经过三个阶段,称之为 JasperReport的生命周期,

这三个阶段为:

设计(Design)阶段、

执行(Execution)阶段

输出(Export)阶段,如下图所示:
在这里插入图片描述

设计阶段(Design):所谓的报表设计就是创建一些模板,模板包含了报表的布局与设计,包括执行计算的复杂公式、可选的从数据源获取数据的查询语句、以及其它的一些信息。模板设计完成之后,将模板保存为JRXML文件(JR代表JasperReports),其实就是一个XML文件。

**执行阶段(Execution):**使用以JRXML文件编译为可执行的二进制文件(即.Jasper文件)结合数据进行执行,填充报表数据

输出阶段(Export):数据填充结束,可以指定输出为多种形式的报表

2. 模板工具Jaspersoft Studio

2.1 概述

Jaspersoft Studio 是一个可视化的报表设计工具,使用该软件可以方便地对报表进行可视化的设计,设计结果为格式.jrxml 的XML 文件,并且可以把.jrxml 文件编译成.jasper 格式文件方便 JasperReport 报表引擎解析、显示。

2.2 安装配置

到JasperReport官网下载 [https://community.jaspersoft.com/community-download

2.3 基本使用

2.3.1 模板制作

(1)打开Jaspersoft Studio ,新建一个project, 步骤: File -> New -> Project-> JasperReportsProject

在这里插入图片描述

(2) 新建一个Jasper Report模板,在 Stidio的左下方Project Explorer 找到刚才新建的Project ,步骤:项目右键 -> New -> Jasper Report

在这里插入图片描述

(3)选择 Blank A4 (A4纸大小的模板),然后 Next 命名为test02.jrxml

在这里插入图片描述

如图所示,报表模板被垂直的分层,每一个部分都是一个Band,每一个Band的特点不同:

在这里插入图片描述

Title(标题):只在整个报表的第一页的最上端显示。只在第一页显示,其他页面均不显示。

Page Header(页头):在整个报表中每一页都会显示。在第一页中,出现的位置在 Title Band的下面。在除了第一页的其他页面中Page Header 的内容均在页面的最上端显示。

Page Footer(页脚):在整个报表中每一页都会显示。显示在页面的最下端。一般用来显示页码。

Detail 1(详细):报表内容,每一页都会显示。

Column Header(列头):Detail中打印的是一张表的话,这Column Header就是表中列的列头。

Column Footer(列脚):Detail中打印的是一张表的话,这Column Footer就是表中列的列脚。

Summary(统计):表格的合计段,出现在整个报表的最后一页中,在Detail 1 Band后面。主要是用来做报表的合计显示。

(4) 通过右边控件画出一个简单的报表模型

在这里插入图片描述

2.3.2 编译模板

右键单机模板文件 -> compile Report 对模板进行编译,生成.jasper文件

2.3.3 整合工程

(1) 导入坐标

    <dependencies>
        <!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.17.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-fonts</artifactId>
            <version>6.17.0</version>
            <!--<scope>system</scope>
            <systemPath>${project.basedir}/lib/jasperreports-fonts-6.17.0.jar</systemPath>-->
        </dependency>
        <dependency>
            <groupId>net.sf.barcode4j</groupId>
            <artifactId>barcode4j</artifactId>
            <version>2.1</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.barbecue</groupId>
            <artifactId>barbecue</artifactId>
            <version>1.5-beta1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-bridge</artifactId>
            <version>1.14</version>
        </dependency>
    </dependencies>

(2)引入模板

将编译好的模板拷贝出来到桌面上

(3) main方法测试

public class JasperDemo {
    public static void main(String[] args) throws Exception{
        //1.读取模板文件
        FileInputStream inputStream = new FileInputStream("C:\\Users\\makeke\\Desktop\\test01.jasper");
        //2.准备数据
        Map<String,Object> parms = new HashMap<String, Object>();
        //3.模板和数据整合
        JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, parms, new JREmptyDataSource());
        //4.导出PDF
        JasperExportManager.exportReportToPdfStream(jasperPrint,new FileOutputStream("D://demo1.pdf"));

    }
}

ps:此时会发现,导出的模板是空白的,因为没有对字体进行处理,导致识别不出中文

(4) 中文处理(以华云宋体为例):

模板字体设置为华云宋体:

在这里插入图片描述

在项目中添加配置文件

添加properties文件:

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory

net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml

指定中文配置文件fonts.xml

<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
    <!--<fontFamily name="Lobster Two">-->
    <!--<normal>lobstertwo/LobsterTwo-Regular.otf</normal>-->
    <!--<bold>lobstertwo/LobsterTwo-Bold.otf</bold>-->
    <!--<italic>lobstertwo/LobsterTwo-Italic.otf</italic>-->
    <!--<boldItalic>lobstertwo/LobsterTwo-BoldItalic.otf</boldItalic>-->
    <!--<pdfEncoding>Identity-H</pdfEncoding>-->
    <!--<pdfEmbedded>true</pdfEmbedded>-->
    <!--<!-->
    <!--<exportFonts>-->
    <!--<export key="net.sf.jasperreports.html">'Lobster Two', 'Times New Roman', Times, serif</export>-->
    <!--</exportFonts>-->
    <!-->-->
    <!--</fontFamily>-->
    <fontFamily name="华文宋体">
        <normal>stsong/stsong.TTF</normal>
        <bold>stsong/stsong.TTF</bold>
        <italic>stsong/stsong.TTF</italic>
        <boldItalic>stsong/stsong.TTF</boldItalic>
        <pdfEncoding>Identity-H</pdfEncoding>
        <pdfEmbedded>true</pdfEmbedded>
        <exportFonts>
            <export key="net.sf.jasperreports.html">'华文宋体', Arial, Helvetica, sans-serif</export>
            <export key="net.sf.jasperreports.xhtml">'华文宋体', Arial, Helvetica, sans-serif</export>
        </exportFonts>
        <!--
        <locales>
            <locale>en_US</locale>
            <locale>de_DE</locale>
        </locales>
        -->
    </fontFamily>
</fontFamilies>

引入字体库stsong.TTF

整个目录如下:
在这里插入图片描述

运行结果:

在这里插入图片描述

3.数据填充

上面介绍了如何使用JasperReport来生成简单的文本报表,正式企业开发中动态数据展示也是报表中最重要的一环,接下来将介绍填充动态数据到PDF报表中的方法。

JasperReport对报表模板中的数据填充有很多种方式,最典型的有以下两种:

Parameters(参数)填充

DataSource(数据源)填充

3.1 参数Map填充数据

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

3.1.1 模板制作

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

在这里插入图片描述

(2)创建Parameter

在outline面板中找到Parameters,右键 -> Create Parameter,新建一个Parameter(生成一个Paramerter1)

右键 Paramete1 -> Show Properties. 设置Name为title、Class为java.lang.String.这里要注意名字要认真取不能重复,因为传入的参数的key就是这个参数名,以此来进行一一对应

在这里插入图片描述

(3)模板参数设置

将设置好的参数直接拖入表格中对应的位置,并设置好大小与对齐方式。
在这里插入图片描述

3.1.2 代码测试

(1) 引入模板

将编译好的模板拷贝出来到桌面上

(2) main方法测试

    public static void main(String[] args) throws Exception {
        String filePath = "C:\\Users\\makeke\\Desktop\\test02.jasper";
        // 1.文件的输入流
        InputStream inputStream = new FileInputStream(filePath);
        //2.创建JasperPrint,向jasper文件中填充数据
        FileOutputStream os = new FileOutputStream("D:\\demo2.pdf");
        try {
            Map<String,Object> parameters = new HashMap<String,Object>();
            //设置参数 参数的key = 模板中使用的parameters参数的name
            parameters.put("title","简介");
            parameters.put("name","马可可");
            parameters.put("mate","男");
            parameters.put("age","26");
            parameters.put("job","java工程师");
            //3.将JasperPrint已PDF的形式输出
            JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream,parameters,new JREmptyDataSource());
            //导出
            JasperExportManager.exportReportToPdfStream(jasperPrint,os);
        } catch (JRException e) {
            e.printStackTrace();
        }finally {
            os.flush();
        }
    }

(3) 结果

在这里插入图片描述

3.2 数据源填充数据

3.2.1 JDBC数据源
3.2.1.1 配置数据连接

使用JDBC数据源填充数据:使用Jaspersoft Studio 先要配置一个数据库连接

填写数据源的类型,选择“DatabaseJDBC Connection”

在这里插入图片描述

配置数据库信息

在这里插入图片描述

3.2.1.2 模板制作

(1)制作空白模板

创建空白模板,并将不需要的Band删除

(2)将数据库用户字段配置到模块中

为了方便的进行模板制作,可以将需要数据库表中的字段添加到Studio中。在outline中右键模板,选择datasetand query

在这里插入图片描述

用户可以在 SQL 查询语句输入窗口中,输入需要查询数据的查询语句,点击右上角的“ReadFields”按钮,界面下方的字段列表中,就会显示此查询语句中所涵盖的所有字段的列表。在后面的报表设计中,我们就可以直接使用这些字段了。

在这里插入图片描述

在“Fields”列表中,只保留报表中使用的字段,其他用不到的字段最好用“Delete”删掉,防止由于数据表变化,导致报表模板中的字段设置与数据表对应不上,导致报表报错。输入完毕后,点击“OK”按钮,系统即会把查询语句保存在报表模板中。

(3)填充Filed

将name,mate,age等拖入到 test03中设计模板如下:

在这里插入图片描述

3.2.1.3 代码测试

(1)引入模板

将编译好的模板拷贝出来到桌面上

(2)main方法测试

    public static void main(String[] args) throws Exception {
        String filePath = "C:\\Users\\makeke\\Desktop\\test03.jasper";
        //文件的输入流
        InputStream inputStream = new FileInputStream(filePath);
        //2.创建JasperPrint,向jasper文件中填充数据
        FileOutputStream os = new FileOutputStream("D:\\demo3.pdf");
        try {
            Map<String,Object> parameters = new HashMap<String,Object>();
            //获取数据库连接
            Connection conn= getConnection();
            JasperPrint print = JasperFillManager.fillReport(inputStream,parameters,conn);
            JasperExportManager.exportReportToPdfStream(print,os);
        } catch (JRException e) {
            e.printStackTrace();
        }finally {
            os.flush();
        }
    }

    private static Connection getConnection() throws Exception {
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/makeke","root","root");
        return conn;
    }

(3)结果

在这里插入图片描述

3.2.2 JavaBean数据源
3.2.2.1 模板制作

(1)创建Filed

在这里插入图片描述

(2) 构造模板

在这里插入图片描述

3.2.2.2 代码测试

(1)配置实体类

public class User {
    private String name;
    private String age;
    private String mate;
    private String job;
    setter...getter....
}

(2) 使用javaBean数据源

    public static void main(String[] args) throws Exception {
        String filePath = "C:\\Users\\makeke\\Desktop\\test04.jasper";
        //文件的输入流
        InputStream inputStream = new FileInputStream(filePath);
        //2.创建JasperPrint,向jasper文件中填充数据
        FileOutputStream os = new FileOutputStream("D:\\demo4.pdf");
        try {
            Map<String,Object> parameters = new HashMap<String,Object>();
            //1.构建javaBean的数据源
            String sql = "select t.`name`,t.mate,t.age,t.job from user t";
            Connection connection = getConnection();
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);
            List<User> userList = new ArrayList<User>();
            while (resultSet.next()){
                User user = new User();
                String name = resultSet.getString("name");
                String mate = resultSet.getString("mate");
                String age = resultSet.getString("age");
                String job = resultSet.getString("job");
                user.setName(name);
                user.setMate(mate);
                user.setAge(age);
                user.setJob(job);
                userList.add(user);
            }
            //2.通过list集合创建javaBean的数据源对象
            JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(userList);
            JasperPrint print = JasperFillManager.fillReport(inputStream,parameters,dataSource);
            JasperExportManager.exportReportToPdfStream(print,os);
            statement.close();
            connection.close();
        } catch (JRException e) {
            e.printStackTrace();
        }finally {
            os.flush();
        }
    }

    private static Connection getConnection() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/makeke","root","root");
        return conn;
    }

(3) 结果
在这里插入图片描述

4.总结

​ 上述只是对JasperReport框架做了简单的介绍与演示,JasperReport框架很强大,可以制作各种复杂样式的PDF报表和图形报表,有兴趣的朋友们可以自行了解与研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大王叫我来打死程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值