1. PDF生成
2. iText
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库
坐标
<dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version></dependency>
package com.itheima.app;import com.lowagie.text.Document;import com.lowagie.text.DocumentException;import com.lowagie.text.Paragraph;import com.lowagie.text.pdf.PdfWriter;import java.io.FileNotFoundException;import java.io.FileOutputStream;public class ItextDemo {public static void main(String[] args) {try {Document document = new Document();PdfWriter.getInstance(document, new FileOutputStream("D:\\test.pdf"));document.open();document.add(new Paragraph("hello itext"));document.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (DocumentException e) {e.printStackTrace();}}}
3. JasperReports
JasperReports是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。一般情况下,JasperReports会结合Jaspersoft Studio(模板设计器)使用导出PDF报表。
坐标
<dependency><groupId>net.sf.jasperreports</groupId><artifactId>jasperreports</artifactId><version>6.8.0</version></dependency>
将 jrxml文件 复制到resource目录下
编写java类
@Testpublic void testJasperReports()throws Exception{String jrxmlPath ="D:\\ideaProjects\\projects111\\jasperdemo\\src\\main\\resources\\demo.jrxml";String jasperPath ="D:\\ideaProjects\\projects111\\jasperdemo\\src\\main\\resources\\demo.jasper";//编译模板JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);//构造数据Map paramters = new HashMap();paramters.put("reportDate","2019-10-10");paramters.put("company","itcast");List<Map> list = new ArrayList();Map map1 = new HashMap();map1.put("name","xiaoming");map1.put("address","beijing");map1.put("email","xiaoming@itcast.cn");Map map2 = new HashMap();map2.put("name","xiaoli");map2.put("address","nanjing");map2.put("email","xiaoli@itcast.cn");list.add(map1);list.add(map2);//填充数据JasperPrint jasperPrint =JasperFillManager.fillReport(jasperPath,paramters,new JRBeanCollectionDataSource(list));//输出文件String pdfPath = "D:\\test.pdf";JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);}
3.1. JasperReports原理

- JRXML:报表填充模板,本质是一个xml文件
- Jasper:由JRXML模板编译成的二进制文件,用于代码填充数据
- Jrprint:当用数据填充完Jasper后生成的对象,用于输出报表
- Exporter:报表输出的管理类,可以指定要输出的报表为何种格式
- PDF/HTML/XML:报表形式
4. 模板设计器Jaspersoft Studio
Jaspersoft Studio是一个图形化的报表设计工具,可以非常方便的设计出PDF报表模板文件(其实就是一个xml文件),再结合JasperReports使用,就可以渲染出PDF文件。
下载地址:https://community.jaspersoft.com/community-download
创建新的项目

5. 动态数据填充
Parameters通常用来展示单个数据,Fields通常用来展示需要循环的列表数据。

在Parameters上点击右键,创建一个Parameter参数 以key value形式
5.1. JDBC数据源数据填充

右键data adapters 创建新的数据源


选择mysql驱动

并且添加驱动jar包
在Outline视图中,右键点击工程名,选择Database and Query菜单

切换数据源

添加列名

查询后的字段在Fields中

5.2. JavaBean数据源数据填充
在Fields处点击右键创建新的Field

创建完成后在Properties属性面板中修改Field的名称

使用此种JavaBean数据源数据填充方式,无法正常进行预览,因为这些动态Fields需要在Java程序中动态进行数据填充。
5.3. JDBC数据源输出PDF报表
坐标
<dependency><groupId>net.sf.jasperreports</groupId><artifactId>jasperreports</artifactId><version>6.8.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>
把模板放到指定目录 编写java类
@Testpublic void testReport_JDBC() throws Exception{Class.forName("com.mysql.jdbc.Driver");Connection connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/health","root","123456");String jrxmlPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo1.jrxml";String jasperPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo1.jasper";//编译模板JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);//构造数据Map paramters = new HashMap();paramters.put("company","传智播客");//填充数据---使用JDBC数据源方式填充JasperPrint jasperPrint =JasperFillManager.fillReport(jasperPath,paramters,connection);//输出文件String pdfPath = "D:\\test.pdf";JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);}
中文乱码问题:在Jaspersoft Studio中打开demo1.jrxml文件,选中中文相关元素,统一将字体设置为“华文宋体”并将修改后的demo1.jrxml重新复制到maven工程中 并将字体库放到同目录下
在同级字体目录创建fonts.xml
<?xml version="1.0" encoding="UTF-8"?><fontFamilies><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></fontFamily></fontFamilies>
然后在resources 创建 jasperreports_extension.properties 文件
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactorynet.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml
5.4. Bean数据库输出PDF
与上面基本一致但类中使用的构造方法参数不一致
@Testpublic void testReport_JavaBean() throws Exception{String jrxmlPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo2.jrxml";String jasperPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo2.jasper";//编译模板JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);//构造数据Map paramters = new HashMap();paramters.put("company","传智播客");List<Map> list = new ArrayList();Map map1 = new HashMap();map1.put("tName","入职体检套餐");map1.put("tCode","RZTJ");map1.put("tAge","18-60");map1.put("tPrice","500");Map map2 = new HashMap();map2.put("tName","阳光爸妈老年健康体检");map2.put("tCode","YGBM");map2.put("tAge","55-60");map2.put("tPrice","500");list.add(map1);list.add(map2);//填充数据---使用JavaBean数据源方式填充JasperPrint jasperPrint =JasperFillManager.fillReport(jasperPath,paramters,new JRBeanCollectionDataSource(list));//输出文件String pdfPath = "D:\\test.pdf";JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);}
