目录
概述
在企业级应用开发过程中,报表的生成和打印是一个重要的环节,包括在日常生活学习中.PDF报表也有广泛的应用场景.市面上流行的有三种制作PDF的报表工具,
- iText PDF :用于生成PDF文档的一个java类库,通过IText不仅可以生成PDF文档而且还可以将XML HTML文件转换为PDF文件,代码编写特别复杂
- Openoffice:开源软件,并且能够在Windows和linux平台运行,可以灵活的将word或者Excel转换为PDF文档
- Jasper Report: 是一个强大的 灵活的报表生成工具,能够显示丰富的页面内容,并将之转换成PDF
Jasper Report的开发周期:
- 设计阶段
- 创建一些模板,模板中包含了报表的布局与设计,包括执行计算的复杂公式、可选的从数据源获取数据的查询语句以及其他的一些信息.模板设计完成之后,将模板保存为JRXML文件,也就是XML文件
- 执行阶段
- 使用以JRXML文件编译为可执行的二进制文件,结合数据进行执行,填充报表数据
- 输出阶段
- 数据填充结束之后,执行输出多种形式的报表
Jasper入门
软件链接:链接:
https://pan.baidu.com/s/1RYu3JYpi85w26bEN5ulqMQ
提取码:1m0t
模板的制作和简单导出
1.打开Jaspersoft Studio ,新建一个project, 步骤: File -> New -> Project-> JasperReportsProject
2. 新建一个Jasper Report模板,在 Stidio的左下方Project Explorer 找到刚才新建的Project (我这里新建的是DemoReport),步骤:项目右键 -> New -> Jasper Report
3.选择 Blank A4 (A4纸大小的模板),然后 Next 命名为DemoReport1.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. 开始对制作模板
5.右键单机模板文件 -> compile Report 对模板进行编译,生成.jasper文件,
使用Java工程导出Jasper
1. 创建一个Demo工程
2.导入坐标
<dependencies>
<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>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
3.将编译好的模板放到工程中
4.使用Java导出模板(我们可以在输出路径查看导出的PDF文件).
package com.james;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
public class Dem0 {
public static void main(String[] args) throws Exception {
// 1、导出一个只有静态文本的pdf
// 指定模板的路径
String filePath = "模板的路径";
// 文件的输入流
InputStream inputStream = new FileInputStream(filePath);
// 准备模板中需要的参数
Map parameters = new HashMap();
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, parameters, new JREmptyDataSource());
// 输出路径
JasperExportManager.exportReportToPdfStream(jasperPrint, new FileOutputStream("d:\\demo1.pdf"));
}
}
中文处理
用于Jasper对于中文的支持比较弱,所以以上代码导出可能会看不见中文文字,这时候需要我们手动进行一些中文的设置.
1. 首先在设计阶段我们就指定中文的样式
2.在项目中添加配置文件
添加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
指定中文的配置文件:
<?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,将所有的'华文宋体'改为"仿宋",所有的"stsong"改为"simfang"等-->>
<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
可以在控制面板的字体库中引入.
代码结构: