Spring Boot 集成 Jpa Repository 生成 Jaspersoft Reports,保存/导出 PDF 文件
使用 Jaspersoft Studio 设计报表样式
用你熟悉的环境设计一套最简单的模板,名称定义为: Reports.jrxml
下载源文件:report.jrxml
-
语法比较特殊,需要努力学习
<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report1" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="84feeac3-d1f7-4503-84bf-fc3fa153df55"> <queryString> <![CDATA[]]> </queryString> <field name="id" class="java.lang.Long"/> <field name="price" class="java.math.BigDecimal"/> <field name="quantity" class="java.lang.Integer"/> <field name="categoryName" class="java.lang.String"/> <field name="name" class="java.lang.String"/> <background> <band splitType="Stretch"/> </background> <title> <band height="36" splitType="Stretch"/> </title> <pageHeader> <band height="49" splitType="Stretch"> <staticText> <reportElement x="170" y="10" width="230" height="30" uuid="04d35299-5eb0-4a34-b340-3ca5cf8290fc"/> <textElement> <font fontName="宋体" size="20"/> </textElement> <text><![CDATA[Product List | 产品列表]]></text> </staticText> </band> </pageHeader> <columnHeader> <band height="37" splitType="Stretch"> <staticText> <reportElement x="0" y="10" width="70" height="20" uuid="bcaf85c0-57ff-4a34-af27-cbf1330125ae"/> <textElement> <font fontName="宋体" isBold="true"/> </textElement> <text><![CDATA[ID]]></text> </staticText> <staticText> <reportElement x="90" y="10" width="100" height="20" uuid="faf9b9ee-7cf2-4ea5-80b8-d371c3c753b9"/> <textElement> <font fontName="宋体" isBold="true"/> </textElement> <text><![CDATA[名称]]></text> </staticText> <staticText> <reportElement x="210" y="10" width="70" height="20" uuid="93727672-9f69-4856-aa26-33837e8dc417"/> <textElement> <font fontName="宋体" isBold="true"/> </textElement> <text><![CDATA[价格]]></text> </staticText> <staticText> <reportElement x="314" y="10" width="70" height="20" uuid="09b47abe-09b2-479a-bb76-9770e361a23c"/> <textElement> <font fontName="宋体" isBold="true"/> </textElement> <text><![CDATA[数量]]></text> </staticText> <staticText> <reportElement x="410" y="10" width="100" height="20" uuid="c258f47b-da6a-418d-a5e0-892388ec65c5"/> <textElement> <font fontName="宋体" isBold="true"/> </textElement> <text><![CDATA[类别]]></text> </staticText> </band> </columnHeader> <detail> <band height="39" splitType="Stretch"> <textField> <reportElement x="0" y="4" width="70" height="16" uuid="99fa4c16-cfe2-4482-828e-4439abb9e8f0"/> <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression> </textField> <textField> <reportElement x="210" y="4" width="70" height="16" uuid="ba6e9cfa-6d4c-470b-8bc4-eb2e3411c21e"/> <textFieldExpression><![CDATA[$F{price}]]></textFieldExpression> </textField> <textField> <reportElement x="310" y="4" width="70" height="16" uuid="447253d3-d268-4873-b0b7-9c174c6a7c9f"/> <textFieldExpression><![CDATA[$F{quantity}]]></textFieldExpression> </textField> <textField> <reportElement x="410" y="4" width="100" height="16" uuid="8992d0ad-1f5e-4210-b50b-1e29dc66f119"/> <textFieldExpression><![CDATA[$F{categoryName}]]></textFieldExpression> </textField> <line> <reportElement x="-3" y="27" width="521" height="1" uuid="9b493a65-a499-4199-90bb-b3fedbe45f85"/> </line> <textField> <reportElement x="90" y="4" width="100" height="16" uuid="fcdd8979-dc44-46e3-be56-11e5f33b8e0c"> <property name="com.jaspersoft.studio.spreadsheet.connectionID" value="73fad7b3-74b5-4436-bd46-d2b9c3c113fd"/> </reportElement> <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band height="45" splitType="Stretch"/> </columnFooter> <pageFooter> <band height="54" splitType="Stretch"/> </pageFooter> <summary> <band height="42" splitType="Stretch"/> </summary> </jasperReport>
新建 Spring Boot 项目
-
新建 Spring Boot 项目,不多说
需包含的内容比较特殊,pom.xml,jasperreports 是依赖包,jasperreports-fonts 是字体支持包<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.15.0</version> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports-fonts</artifactId> <version>6.15.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-support</artifactId> <version>2.0.8</version> </dependency>
-
新建各种类
controller, domain, repository, service, 其他,大概目录结构如下
-
创建 Postgresql 数据表
CREATE TABLE public.product ( id bigint NOT NULL, name character varying(255) COLLATE pg_catalog."default", price numeric, quantity integer, category_name character varying(255) COLLATE pg_catalog."default", CONSTRAINT product_pkey PRIMARY KEY (id) )
集成 JasperReports 到 Spring Boot 项目
中文支持文章:Spring Boot 集成 JasperReports,并支持中文PDF
-
Service 服务层处理要求
@RequestMapping(value = "/report", method = RequestMethod.GET) public void report(HttpServletResponse response, @RequestParam(name = "type", defaultValue = "pdf") String type) throws Exception { JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(productService.report()); InputStream inputStream = this.getClass().getResourceAsStream("/report_templates/report.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport(inputStream); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, dataSource); switch (type) { case "html": response.setContentType("text/html;charset=utf-8"); HtmlExporter exporter = new HtmlExporter(DefaultJasperReportsContext.getInstance()); exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); exporter.setExporterOutput(new SimpleHtmlExporterOutput(response.getWriter())); exporter.exportReport(); break; case "pdf": default: JRPdfExporter exporterPdf = new JRPdfExporter(); exporterPdf.setExporterInput(new SimpleExporterInput(jasperPrint)); OutputStream outputStream = response.getOutputStream(); exporterPdf.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStream)); exporterPdf.exportReport(); break; } }
-
可以是 HTML 版本
-
也可以是 PDF 版本