https://www.bilibili.com/video/BV1Ty4y1a77U?p=1(经典IDEA版Java项目医疗实战-传智健康)
java常见的PDF形式报表导出一般有两种形式:
1.iText
iText是用关于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML,Html文件转化为PDF文件。iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar路径,在程序中就可以使用iText类库了。
pom.xml:
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
实现:
public static void main(String[] args) {
try {
Document document = new Document();
pdfWrite.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();
}
}
2. JasperReports
JasperReports能转换PDF,HTML,或者XML格式,一般会结合Jaspersoft Studio(模板设计器)使用导出PDF报表。
pom.xml:
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.4.0</version>
</dependency>
创建jrxml文件,类似于framemark模板文件。(见下文)
public void test(){
String jrxmlPath = "D:\\ideaProjects\\...\\src\\main\\resources\\demo.jrxml";
String jasperPath = "D:\\ideaProjects\\...\\src\\main\\resources\\demo.jasper";
//编译模板
JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);
//构造数据
HashMap paramters = new HashMap();
paramters.put("reportDate","2021-06-16");
paramters.put("company","xuyu");
ArrayList<Map> list = new ArrayList<Map>();
HashMap map1 = new HashMap();
map1.put("name","xuyu");
map1.put("address","xian");
HashMap map2 = new HashMap();
map2.put("name","xuyu");
map2.put("address","xian");
list.add(map1);
list.add(map2);
//填充数据
JasperPath jasperPrint = JasperFileManager.fillReport(jasperPath,paramters,new JRBeanCollectionDataSource(list));
//输出文件
String pdfPath = "D:\\test.pdf";
JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);
}
//基于数据库方式填充数据
public void test1() throws ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/health",root,root);
String jrxmlPath = "D:\\ideaProjects\\...\\src\\main\\resources\\demo.jrxml";
String jasperPath = "D:\\ideaProjects\\...\\src\\main\\resources\\demo.jasper";
//模板编译,编译为后缀为jasper的二进制文件
JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);
//构造数据
Map paramters = new HashMap();
paramters.put("company","xuyu");
//填充数据
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperPath,paramters,connection);
//输出文件
String pdfPath="D:\\test.pdf";
JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);
}
JasperReport原理:
JRXML->Jasper->Jrprint->Exporter->PDF/HTML/XML
JRXML:报表填充模板,本质是一个xml文件
Jasper:由JRXML模板编译成的二进制文件,用于代码填充数据
Jrprint:当用数据填充完Jasper后生成的对象,用于输出报表
Exporter:报表输出的管理类,可以指定要输出的报表为何种格式
PDF/HTML/XML:报表形式
JasperReports到处pdf报表开发流程:
1.制作报表模板
2.模板编译
3.构造数据
4.填充数据
5.输出文件
模板设计器Jaspersoft Studio:
为一个图形化的报表设计工具,可以非常方便的设计出PDF报表模板文件(其实就是一个xml文件),再结合JasperReports使用,就可以渲染出PDF文件。
下载地址:https://community.jaspersoft.com/commounity-download
具体的软件使用详见百度。
结合JasperReports输出报表:
使用Jaspersoft Studio设计好模板(一个使用JDBC数据源,一个使用JavaBean数据源方式进行数据填充)(见上面代码)后,结合JasperReports完成报表输出。
注意:以上方式中文无法正常显示,需要修复:
在Jaspersoft Studio中打开对应的jrxml文件,选中中文相关元素,统一将字体设置为“华文宋体”并将修改后的jrxml文件重新复制到项目中,字体需导入相关字体库
在spring项目中使用JasperReports:
1.把jrxml文件放到resources目录下
2.导入maven坐标(见上面)
3.将解决中文乱码的文件复制到resources目录下
@RestController
@RequestMapping("/report")
public class PDFController {
@Autowired
private ReportService reportService;
//导出PDF文件
@RequestMapping("/exportBusinessReport")
public Result exportReportToPdfFile(HttpServletRequest request, HttpServletResponse response){
try {
//取出返回结果数据,准备将报表数据写入到PDF文件中
Map<String, Object> result = reportService.getBusinessReportData();
List<Map> hotSetmeal = (List<Map>) result.get("hotSetmeal");
//动态获取模板文件绝对磁盘路径
String jrxmlPath = request.getSession().getServletContext().getRealPath("template") + File.separator + "xxx.jrxml";
String jasperPath = request.getSession().getServletContext().getRealPath("template") + File.separator + "xxx.jasper";
//编译模板
JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);
//填充数据
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperPath, result, new JRBeanCollectionDataSource(hotSetmeal));
ServletOutputStream out = response.getOutputStream();
response.setContentType("application/pdf");
response.setHeader("content-Disposition", "attachment;filename=report.pdf");
//输出文件
JasperExportManager.exportReportToPdfStream(jasperPrint, out);
return null;
}catch (Exception e){
e.printStackTrace();
return new Result(false, MessageConstant.OPER_FAILD);
}
}
}