简介
JasperReports是一个用Java开发的开源报表库,它允许开发人员创建基于Java的丰富报表,这些报表可以与多种数据源交互,并可以很容易地集成到Java应用程序中。JasperReports提供了丰富的功能,如数据可视化、图表、子报表、参数化查询等,并支持多种输出格式,包括PDF、HTML、Excel、CSV等。
JasperReports主要由以下几个核心类组成:
- JasperReport:这是JasperReports的顶级类,用于创建报表。它提供了构建报表所需的所有方法。
- JRDataSource:这是一个接口,用于提供数据源,可以是数据库、文件、内存中的对象等。
- JasperPrint:表示报表生成的结果,包含了报表的所有元素,如标题、详细、页脚、图表等。
- JasperExportManager:用于将JasperPrint对象导出为不同的格式,如PDF、HTML、Excel等。
- JasperFillManager:用于填充报表并生成JasperPrint对象。
JasperReports的特点包括:
开源免费:用户可以免费获取和使用,无需支付任何授权费用[5]。
功能丰富:提供了丰富的报表组件和功能,可以满足用户各种类型的报表需求[5]。
多种输出格式和数据源支持:支持多种输出格式和数据源,包括PDF、HTML、Excel等输出格式,以及MySQL、Oracle、SQL Server等数据库,并且还可以直接 使用JSON数据作为数据源。
易于学习和使用:使用简单,学习曲线较平缓,使用者可以很快上手。
报表设计工具
JasperReports报表的设计工具有两种,iReport-5.6.0 和 Jaspersoft Studio,但是iReport目前已经不在维护,最终版本为5.6.0,所以推荐使用 Jaspersoft Studio,Jaspersoft Studio其实就是为了取代 iReport-5.6.0 的;
Jaspersoft Studio下载地址:Download Jaspersoft - Jaspersoft Community ,下载社区版即可;下载安装后,即可开始报表设计之旅了。
创建报表项目
点击菜单:File->New->Project,弹出窗口,选择 JasperReports project ,点击next ,输入项目名称 xmsaas 点击完成。(如果你想用看看一些模版示例,你可以选择创建 JasperReports Samples 项目)
模版设计
3.1 Mysql数据源报表
3.1.1 添加数据源
3.1.1.1添加全局的数据源
点击 添加数据源按钮,弹出数据源设置框。
3.1.1.2添加项目私有数据源
右击项目目录,选择 New->Data Adapter ,弹出数据源设置框,
输入file name .
3.1.1.3 mysql数据源
选择JDBC连接
配置mysql连接,导入mysql连接库
点击Test 按钮,测试连接配置是否成功
3.1.2 新增报表
项目目录右击New->JasperReport ,弹出选择报表模板窗口,选择对应的模板,点击Finish完成,点击Next 则进入新报表模板的数据源选择配置。
3.1.2.1 报表模板的数据源选择
在报表模板Design页面,点击对应按钮,可配置模板的数据源
3.1.3 主子报表的配置
3.1.3.1 新增主子报表
这一步同【3.1.2 新增报表】一样,主报表对应的查询语句是主表查询,子报表对应的是子表查询;
3.1.3.2 主子关联配置
在子报表的查询语句中修改如下,添加一个关联主表字段的关联条件项,其中$P{rela_father_id} , 表示是取主报表的Fields["rela_father_id"]值作为条件值。
3.2 Json 数据源报表
3.2.1 添加数据源
3.2.1.1添加全局的数据源
点击 添加数据源按钮,弹出数据源设置框。
3.2.1.2添加项目私有数据源
右击项目目录,选择 New->Data Adapter ,弹出数据源设置框,
输入file name .
3.2.1.3 json数据源
选择JSON File数据源
选择你的JSON文件位置,并点击Test按钮。
示例 json:
{
"order": {
"od_id": 33288,
"odg_id": 32841,
"od_code": "GOD24040265",
"od_version": "2",
"od_state": "2",
"od_state_aprv": "1",
"od_state_history": null,
"od_creator_id": 2775,
"odg_item_no": "58200",
"odg_item_name": "拉毛粗针套装",
"odg_item_name_en": "SUPERSOFT SET",
"odg_brand": "PRIMARK",
"color": [{
"odgc_id": 83727,
"odgc_ver": "1",
"odgc_delete": "0",
"odgc_odg_id": 32841,
"odgc_no": "1",
"odgc_color": "Oatmeal",
"odgc_color_no": "",
"odgc_price": "4.8000",
"odgc_pcs": 278256,
"2XS-4/6": "14113",
"XS-6/8": "39127",
"S-10/12": "73369",
"M-12/14": "77996",
"L-14/16": "44628",
"XL-18/20": "29023"
},
{
"odgc_id": 83730,
"odgc_ver": "1",
"odgc_delete": "0",
"odgc_odg_id": 32841,
"odgc_no": "2",
"odgc_color": "Grey Marl",
"odgc_color_no": "",
"odgc_price": "4.8000",
"odgc_pcs": 288797,
"2XS-4/6": "14724",
"XS-6/8": "40110",
"S-10/12": "75943",
"M-12/14": "81323",
"L-14/16": "46399",
"XL-18/20": "30298"
}
]
}
}
3.2.2 新增报表
项目目录右击New->JasperReport ,弹出选择报表模板窗口,选择对应的模板,点击Finish完成,点击Next 则进入新报表模板的数据源选择配置。
3.2.2.1 报表数据源选择
在报表模板Design页面,点击对应按钮,可配置模板的数据源
3.2.3 主子报表的配置
需要先创建两个报表,然后分别对两个报表进行设计,再进行关联。
3.2.3.1 主报表设计
选择主信息属性作为Field
将抬头字段拖到到报表模板里的TITLE位置,并拖动子报表元素到detail里
3.2.3.2 子报表设计
首先,需要创建新的一张报表作为子报表用,步骤同【3.2.2新增报表】,
然后,选择读取主信息下的子表属性,作为子报表的Field
子报表保留detail区域,其余删掉;并将需要的Field拖动到detail里;也可以给子报表设置写表格,背景色等。
3.2.3.3 主子关联
回到主报表模板,进行设置。在Outline窗口创建一个自定义的Parameter-SUB_PATH,代表子报表的路径。
并进行Expression,Data source Express 的配置。
Expression:$P{SUB_PATH}+"sales_order_colors.jasper"
Data source Express:((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("color")
配置完成。
先编译子报表,在编译主报表,点击预览,输入子报表路径参数SUB_PATH的值。
4、解决问题
4.1、jaspersoft studio中预览报表时,导出PDF里中文不显示
在Studio中设置Font,步骤: Window -> Preferences -> Jaspersoft Studio -> Fonts
添加 字体文件 ttf文件,这里以 微软雅黑 为例
添加完成后,可以在选择字体栏发现添加的字体
4.2、java服务报表导出PDF不显示中文
根据pom.xml依赖配置找到报表字体库 jasperreports-fonts 目录
将jar包解压到当前的目录的子目录中 jasperreports-fonts-6.20.6 中
找到子目录里的 net/sf/jasperreports/fonts/dejavu目录,将下载的微软雅黑的字体tff文件拷贝进去
然后返回上一级目录,打开fonts.xml文件增加一个fontFamily,修改如下:
返回到最外面的子目录jasperreports-fonts-6.20.6下,执行shell命令,重新打包生成 jasperreports-fonts-6.20.6.jar
jar cvf jasperreports-fonts-6.20.6.jar *
用重新打的jar包,替换外面的 jasperreports-fonts-6.20.6.jar ,然后删除原解压生成的子目录 jasperreports-fonts-6.20.6
完成字体配置。
4.3、java报表服务 部署Linux问题
导出PDF报错: Font "微软雅黑" is not available to the JVM. See the Javadoc for more details.
解决方法:https://www.cnblogs.com/zhuqianchang/p/9045434.html
将简体中文字体复制到linux下,保存路径为:/usr/share/fonts/chinese/TrueType
使用命令 ,更新字体库
fc-cache -fv
修改服务器系统语言
vi /etc/locale.conf
在文件中,设置 LANG
为你想要的语言环境。例如,如果你想使用中文(简体):
LANG="zh_CN.UTF-8"
保存修改后,重启服务器系统
reboot
重启后,就解决了。
4.4、导出word和excel时,部分单元格内容没显示
设计报表时,text元素不要有重叠,如果有两个共享某个区域的元素,则该元素将无法正确呈现并导致word 和excel报表中缺少列或数据。
5、Reports Server 搭建
创建maven应用
应用名称server-report
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>server-report</artifactId>
<groupId>sy.xmsaas</groupId>
<version>1.0.0</version>
<name>server-report</name>
<description>Jasper Reports Server</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<nacos.version>0.2.11</nacos.version>
<alibaba.cloud.version>2.2.6.RELEASE</alibaba.cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>sy.xmsaas</groupId>
<artifactId>common2</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${alibaba.cloud.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${alibaba.cloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- 数据持久化 mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.19.1</version>
<!--
使用适合你项目的版本号,这里一定要注意有坑,版本一定要跟你的 JaspersoftStudio报表设计工具匹配,至少要前面两个版本号一直,
我的JaspersoftStudio是6.19.1,一开始这里我用的是6.20.6,导致我的报表模版中的交叉表填充数据报异常错误。
-->
</dependency>
<!-- JasperReports字体库 -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>6.20.6</version> <!-- 与JasperReports核心库保持相同的版本号 -->
</dependency>
<!-- iText库(如果需要导出为PDF) -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.0</version> <!-- 使用适合你项目的版本号 -->
</dependency>
<!-- (如果需要导出为Excel) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.6.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--springboot中的redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring session 和 redis starter集成包 目的用于分布式session管理-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
yml主要配置
##----常用配置变量
report:
template:
# 报表模板根路径
rootPath: E:/JasperReports/templates/
# 报表数据源配置,数据库名是不固定的,因为可能是不同应用不同租户数据库,所以使用动态数据源,要在代码中获取,然后替换dbName
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.0.11:3311/*dbName*?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: sysoft
password: tfosys
url:
invalidSession: http://localhost:8101/home/
invalidSession2: http://localhost:8106/home/
authenticated: http://localhost:8101/home/
unauthenticated: http://localhost:8188/login
auth: http://localhost:8188
login: http://localhost:8101/login
eureka: http://localhost:9301/eureka
mysql: jdbc:mysql://192.168.0.11:3311/xmsaas?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
redis: 192.168.0.156
hasrole: 采购员
denied: http://sysoft.tpddns.cn:8188/user/#
personCenter: http://localhost:8188/pc/#/eip_pc
##----servlet
server:
port: 9602
# session失效时间
servlet:
session:
timeout: PT3H
# timeout: PT1M
#此处增加一个sessionid,防止和springboot内置tomcat生成的sessionid同名(为JSEESIONID)
#但是此指令在springboot2.0之前为server.session.cookie.name=OAUTH2SESSION,2.0之后如下,此为坑应注意。
#JSESSIONID应该是用于浏览器-授权服务器,而OAUTH2SESSION是用于浏览器-客户端
cookie:
name: S_REPORT
##----spring
spring:
main:
allow-bean-definition-overriding: true
application:
name: Report
profiles:
include: errorcode,sysconfig
#json数据 日期 格式化
jackson:
date-format: "yyyy-MM-dd HH:mm:ss"
time-zone: GMT+8
# 数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${url.mysql}
username: sysoft
password: tfosys
#nacos配置需要下一行
platform: mysql
# http
http:
# 过滤字符编码
encoding:
charset: UTF-8
enabled: true
force: true
# 文件上传大小
servlet:
multipart:
# 单个文件大小
max-file-size: 50MB
# 一次传多个文件的总大小
max-request-size: 100MB
# #redis
redis:
database: 0
# Redis服务器地址
host: ${url.redis}
port: 9402
password: 123456
timeout: 5000ms
jedis:
pool:
# 连接池中的最大连接数
max-active: 8
# 连接池中的最大空闲连接
max-idle: 8
min-idle: 0
max-wait: -1ms
jpa:
open-in-view: false
##----Mybatis Config
mybatis:
check-config-location: true
typeAliasesPackage: sy.xmsaas.workflow.domain.*
mapperLocations: classpath:mapper/*.xml
type-handlers-package: sy.xmsaas.common2.mybatis.*
##----Pagehelper
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
##----通用 Mapper ###
mapper:
IDENTITY: mysql
notEmpty: false
mappers:
- sy.xmsaas.common2.mapper.Mapper
- sy.xmsaas.common2.mapper.TkMapper
##----日志
logging.config: classpath:logging-nacos.xml
##----Swagger
swagger:
title: 接口文档
basepackage: sy.xmsaas
version: 1.0.0
##----监控
management:
endpoint:
web:
exposure:
#暴露所有端点信息!!!!生产环境应该关闭
include: "*"
主要代码
生成报表输出PDF返回给前端的接口部分代码
/**
* JasperPrint 基础数据构建
*
* @param request
* @param response
* @param relativeFileName 报表文件相对路径
* @param parameters 参数集
* @return
* @throws JRException
* @throws SQLException
*/
private JasperPrint buildBase(HttpServletRequest request, HttpServletResponse response, String relativeFileName,
Map<String, Object> parameters) throws JRException, SQLException, ClassNotFoundException {
File reportFile = new File(reportRootDir + relativeFileName);
if (!reportFile.exists())
throw new JRRuntimeException("报表文件 "+ reportRootDir + relativeFileName +" 未找到. 请先编译成.jasper文件.");
JasperReport jasperReport = (JasperReport) JRLoader.loadObjectFromFile(reportFile.getPath());
//报表内嵌套引用其它报表需要传入文件的绝对路径,不然会报找不到对应报表, 这里设置的local_path参数是主报表目录
parameters.put("LOCAL_PATH", getAbsParentPath(reportFile));
JasperPrint jasperPrint = fillReport(jasperReport, parameters, request);
request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
return jasperPrint;
}
public void pdf(HttpServletRequest request, HttpServletResponse response, String relativeFileName,
Map<String, Object> parameters, String outputFileName)
throws ServletException, SQLException, IOException, JRException, ClassNotFoundException {
JasperPrint jasperPrint = buildBase(request, response, relativeFileName, parameters);
FileBufferedOutputStream fbos = new FileBufferedOutputStream();
JRPdfExporter exporter = new JRPdfExporter(DefaultJasperReportsContext.getInstance());
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(fbos));
try {
exporter.exportReport();
fbos.close();
if (fbos.size() > 0) {
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=\"" + outputFileName + "\"");
response.setContentLength(fbos.size());
ServletOutputStream outputStream = response.getOutputStream();
try {
fbos.writeData(outputStream);
fbos.dispose();
outputStream.flush();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException ex) {
}
}
}
}
} catch (JRException e) {
throw new ServletException(e);
} finally {
fbos.close();
fbos.dispose();
}
}
根据当前接口请求头信息,获取租户和应用数据库名称,创建对应的数据源连接
private Connection getTenantConnection(HttpServletRequest request) throws SQLException, ClassNotFoundException {
return tenantUtils.getTenantConnection(getTenantIdFromContext(request), getDbNameFromContext(request));
}
protected JasperPrint fillReport(JasperReport jasperReport, Map<String, Object> parameters, HttpServletRequest request) throws SQLException, ClassNotFoundException, JRException {
return JasperFillManager.fillReport(jasperReport, parameters, getTenantConnection(request));
}
private String getTenantIdFromContext(HttpServletRequest request) {
// 这里应根据实际情况从线程上下文或其他来源获取租户ID
// 例如,可以从HTTP请求头、线程局部变量或配置文件中获取
return request.getHeader("Db-Suffix"); // 示例中返回固定的租户ID
}
private String getDbNameFromContext(HttpServletRequest request) {
// 返回的是对应的应用数据库名称(不含租户编码后缀)
return request.getHeader("App-Db-Name");
}
tenantUtils.getTenantConnection
public Connection getTenantConnection(String tenantId, String dbName) throws ClassNotFoundException, SQLException {
//导入MySQL驱动(新版MySQL用com.mysql.cj.jdbc.Driver)
//System.out.println("mysql-mysqlDriver:" + mysqlDriver);
Class.forName(mysqlDriver);
String url = getJdbcUrlForTenant(tenantId, dbName);
String username = getUsernameForTenant(tenantId);
String password = getPasswordForTenant(tenantId);
//System.out.println("mysql-url:" + url);
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
6、Reports Server API说明
报表服务属于内部微服务,没有提供认证机制,所以需要走上一层应用网关,再转到内部服务;
6.1 数据库报表API
DatabaseReportController
提供了多个端点,用于根据提供的 JSON 参数从指定的模板文件生成不同格式(HTML、PDF、Word)的报告。下面是每个端点的详细文档。
基本信息
- 控制器类:
sy.xmsaas.report.controller.DatabaseReportController
- 父类:
JasperBaseController
端点
1. 生成 HTML 格式报告
请求 URL:
GET /database/report/to/html
Header: {'Accept': 'application/pdf', 'Db-Suffix': 'SYT230001', 'App-Db-Name':
请求Header:
- Accept (
String
, 必填):text/html - Db-Suffix (
String
, 必填):[租户编码] - App-Db-Name (
String
, 必填):[应用数据库名]
参数:
- reportFileName (
String
, 必填): 相对报表根路径的报告模板完整文件名。 - paramString (
String
, 必填): 以 JSON 格式封装的参数集合(Map键值对),用于填充报告中的动态数据。
示例:
GET: /database/report/to/html?reportFileName=xmsaas-gbs%2Forder_print.jasper¶mString=%7B%22od_id%22%3A9%7D
header:
Accept: application/pdf
App-Db-Name: xmsaas-gbs
Db-Suffix: SYT230001
2. 生成 PDF 格式报告
请求 URL:
GET /database/report/to/pdf
请求Header:
- Accept (
String
, 必填):application/pdf - Db-Suffix (
String
, 必填):[租户编码] - App-Db-Name (
String
, 必填):[应用数据库名]
参数:
同上。
示例:
GET: /database/report/to/pdf?reportFileName=xmsaas-gbs%2Forder_print.jasper¶mString=%7B%22od_id%22%3A9%7D
header:
Accept: application/pdf
App-Db-Name: xmsaas-gbs
Db-Suffix: SYT230001
3. 生成 Word 格式报告
请求 URL:
GET /database/report/to/word
请求Header:
- Accept (
String
, 必填):application/vnd.openxmlformats-officedocument.wordprocessingml.document - Db-Suffix (
String
, 必填):[租户编码] - App-Db-Name (
String
, 必填):[应用数据库名]
参数:
同上。
示例:
GET: /database/report/to/word?reportFileName=xmsaas-gbs%2Forder_print.jasper¶mString=%7B%22od_id%22%3A9%7D
header:
Accept: application/pdf
App-Db-Name: xmsaas-gbs
Db-Suffix: SYT230001
注意事项
- 所有请求都必须提供
reportFileName
和paramString
参数,否则会抛出IllegalArgumentException
。 paramString
必须是一个有效的 JSON 字符串,否则将抛出IOException
。
通过上述端点,用户可以灵活地选择报告的输出格式,并通过传递不同的参数来定制报告内容。
6.2 json报表API
JsonReportController
控制器提供了一系列的端点,允许用户通过 JSON 数据和参数生成 HTML、PDF 或 Word 格式的报告。以下是各个端点的详细说明:
基本信息
- 控制器类:
sy.xmsaas.report.controller.JsonReportController
- 继承自:
JasperBaseController
端点
1. 生成 HTML 格式报告
请求方法:
POST /json/report/to/html
请求Header:
- Accept (
String
, 必填):text/html - Db-Suffix:[租户编码]
请求体:
- jsonReport (
JsonReport
, 必填): 包含报告模板文件名、JSON 数据字符串以及参数字符串的对象。
参数:
- reportFileName (
String
, 必填): 相对报表根路径的报告模板完整文件名。 - jsonDataString (
String
, 必填): 以 JSON 格式封装的数据字符串,用于填充报告中的数据。 - paramString (
String
, 必填): 以 JSON 格式封装的参数字符串,用于控制报告的生成行为。
示例:
POST: /json/report/to/html
requestBody:
{
"reportFileName": "xmsaas-gbs/sales_order.jasper",
"paramString": "{}",
"jsonDataString": "{\"order\":{\"od_id\":33288,\"odg_id\":32841,\"od_code\":\"GOD24040265\",\"od_version\":\"2\",\"od_state\":\"2\",\"od_state_aprv\":\"1\",\"od_state_history\":null,\"od_creator_id\":2775,\"odg_item_no\":\"58200\",\"odg_item_name\":\"拉毛粗针套装\",\"odg_item_name_en\":\"SUPERSOFT SET\",\"odg_brand\":\"PRIMARK\",\"color\":[{\"odgc_id\":83727,\"odgc_ver\":\"1\",\"odgc_delete\":\"0\",\"odgc_odg_id\":32841,\"odgc_no\":\"1\",\"odgc_color\":\"Oatmeal\",\"odgc_color_no\":\"\",\"odgc_price\":\"4.8000\",\"odgc_pcs\":278256,\"2XS-4/6\":\"14113\",\"XS-6/8\":\"39127\",\"S-10/12\":\"73369\",\"M-12/14\":\"77996\",\"L-14/16\":\"44628\",\"XL-18/20\":\"29023\"},{\"odgc_id\":83730,\"odgc_ver\":\"1\",\"odgc_delete\":\"0\",\"odgc_odg_id\":32841,\"odgc_no\":\"2\",\"odgc_color\":\"Grey Marl\",\"odgc_color_no\":\"\",\"odgc_price\":\"4.8000\",\"odgc_pcs\":288797,\"2XS-4/6\":\"14724\",\"XS-6/8\":\"40110\",\"S-10/12\":\"75943\",\"M-12/14\":\"81323\",\"L-14/16\":\"46399\",\"XL-18/20\":\"30298\"}]}}"
}
header:
Accept: text/html
Db-Suffix: SYT230001
2. 生成 PDF 格式报告
请求方法:
POST /json/report/to/pdf
请求Header:
- Accept (
String
, 必填):application/pdf - Db-Suffix:[租户编码]
请求体:
- jsonReport (
JsonReport
, 必填): 包含报告模板文件名、JSON 数据字符串以及参数字符串的对象。
参数:
同上。
示例:
POST: /json/report/to/pdf
requestBody:
{
"reportFileName": "xmsaas-gbs/sales_order.jasper",
"paramString": "{}",
"jsonDataString": "{\"order\":{\"od_id\":33288,\"odg_id\":32841,\"od_code\":\"GOD24040265\",\"od_version\":\"2\",\"od_state\":\"2\",\"od_state_aprv\":\"1\",\"od_state_history\":null,\"od_creator_id\":2775,\"odg_item_no\":\"58200\",\"odg_item_name\":\"拉毛粗针套装\",\"odg_item_name_en\":\"SUPERSOFT SET\",\"odg_brand\":\"PRIMARK\",\"color\":[{\"odgc_id\":83727,\"odgc_ver\":\"1\",\"odgc_delete\":\"0\",\"odgc_odg_id\":32841,\"odgc_no\":\"1\",\"odgc_color\":\"Oatmeal\",\"odgc_color_no\":\"\",\"odgc_price\":\"4.8000\",\"odgc_pcs\":278256,\"2XS-4/6\":\"14113\",\"XS-6/8\":\"39127\",\"S-10/12\":\"73369\",\"M-12/14\":\"77996\",\"L-14/16\":\"44628\",\"XL-18/20\":\"29023\"},{\"odgc_id\":83730,\"odgc_ver\":\"1\",\"odgc_delete\":\"0\",\"odgc_odg_id\":32841,\"odgc_no\":\"2\",\"odgc_color\":\"Grey Marl\",\"odgc_color_no\":\"\",\"odgc_price\":\"4.8000\",\"odgc_pcs\":288797,\"2XS-4/6\":\"14724\",\"XS-6/8\":\"40110\",\"S-10/12\":\"75943\",\"M-12/14\":\"81323\",\"L-14/16\":\"46399\",\"XL-18/20\":\"30298\"}]}}"
}
header:
Accept: application/pdf
Db-Suffix: SYT230001
3. 生成 Word 格式报告
请求方法:
POST /json/report/to/word
请求Header:
- Accept (
String
, 必填):application/vnd.openxmlformats-officedocument.wordprocessingml.document - Db-Suffix:[租户编码]
请求体:
- jsonReport (
JsonReport
, 必填): 包含报告模板文件名、JSON 数据字符串以及参数字符串的对象。
参数:
同上。
示例:
POST: /json/report/to/word
requestBody:
{
"reportFileName": "xmsaas-gbs/sales_order.jasper",
"paramString": "{}",
"jsonDataString": "{\"order\":{\"od_id\":33288,\"odg_id\":32841,\"od_code\":\"GOD24040265\",\"od_version\":\"2\",\"od_state\":\"2\",\"od_state_aprv\":\"1\",\"od_state_history\":null,\"od_creator_id\":2775,\"odg_item_no\":\"58200\",\"odg_item_name\":\"拉毛粗针套装\",\"odg_item_name_en\":\"SUPERSOFT SET\",\"odg_brand\":\"PRIMARK\",\"color\":[{\"odgc_id\":83727,\"odgc_ver\":\"1\",\"odgc_delete\":\"0\",\"odgc_odg_id\":32841,\"odgc_no\":\"1\",\"odgc_color\":\"Oatmeal\",\"odgc_color_no\":\"\",\"odgc_price\":\"4.8000\",\"odgc_pcs\":278256,\"2XS-4/6\":\"14113\",\"XS-6/8\":\"39127\",\"S-10/12\":\"73369\",\"M-12/14\":\"77996\",\"L-14/16\":\"44628\",\"XL-18/20\":\"29023\"},{\"odgc_id\":83730,\"odgc_ver\":\"1\",\"odgc_delete\":\"0\",\"odgc_odg_id\":32841,\"odgc_no\":\"2\",\"odgc_color\":\"Grey Marl\",\"odgc_color_no\":\"\",\"odgc_price\":\"4.8000\",\"odgc_pcs\":288797,\"2XS-4/6\":\"14724\",\"XS-6/8\":\"40110\",\"S-10/12\":\"75943\",\"M-12/14\":\"81323\",\"L-14/16\":\"46399\",\"XL-18/20\":\"30298\"}]}}"
}
header:
Accept: application/vnd.openxmlformats-officedocument.wordprocessingml.document
Db-Suffix: SYT230001
注意事项
- 所有 POST 请求都必须包含一个有效的
JsonReport
对象在请求体中。 jsonDataString
和paramString
必须是有效的 JSON 字符串,否则将抛出IOException
。reportFileName
必须是有效的报告模板文件路径。
通过这些端点,用户可以利用 JSON 数据和参数来定制并生成所需的报告格式,满足各种业务需求。
7、VUE报表模板预览组件
组件名称:report_preview
此组件专为jasperReports报表模板提供预览和下载,预览和导出格式包括PDF、HTML、Word(DOCX)和Excel(XLSX)。它支持不同的操作模式(preview 和 test),并能处理数据库和JSON数据源。
Props
show
: 布尔值,指示是否显示报表预览。reportType
: 报表的类型,可选值有pdf
、html
、word
和excel
,默认为pdf
。viewMode
: 预览模式,可选值有preview
(预览)和test
(测试),默认为preview
。reportData
: 报表数据,这是一个对象,包含以下字段:report_name
: 报表的名称。report_file_name
: 报表文件名。report_parameters
: 报表参数数组,每个元素是一个包含name
(参数名)、data_type
(数据类型,如Integer
、String
、Float
)和value
(参数值)的对象。report_datasource_type
: 数据源类型,可以是database
或json
。json_data_string
: 当数据源类型为json
时,此字段用于传递JSON数据源数据字符串。report_db_name
: 当数据源类型为database
时,用于指定报表数据库名。
reportData示例:
{
report_name: '销售订单',
report_file_name: 'xmsaas-gbs/order_print.jasper',
report_parameters: [
{
name: 'od_id',
data_type: 'Integer',
value: 9
}
],
report_datasource_type: 'database',
json_data_string: null,
report_db_name: 'xmsaas-gbs'
}
计算属性
tenant
: 返回用户状态中的租户信息,如果没有则返回空对象。
数据
view_funcs
: 一个函数映射对象,用于根据数据源类型选择预览方法。exportType
: 当前报表的输出类型,由reportType
prop初始化。docTypes
: 一个映射对象,包含每种报表类型的MIME类型。
生命周期钩子
mounted
: 如果viewMode
为preview
,则在组件挂载后立即调用预览方法。
方法
closeModal
: 关闭组件的模态对话框。toQueryString
: 将对象转换为URL查询字符串。getParameterString
: 处理并返回报表参数的JSON字符串。preview
: 根据数据源类型调用相应的预览方法。previewMysqlReport
: 从数据库预览报表的方法。previewJsonReport
: 从JSON数据预览报表的方法。ajax
: 发送AJAX请求以获取报表数据,支持GET和POST方法。fillFrame
: 使用得到的数据填充报表,可以是在当前页面的<iframe>
中展示或在新窗口打开。
注意事项
- 该组件通过发送AJAX请求到特定的URL来获取报表数据,并且能够根据报表类型和预览模式正确处理响应数据。
- 支持通过数据库或JSON数据源动态生成报表。
- 预览功能既可在当前页面内实现,也可在新窗口中打开。