JasperReports报表入门学习记录

简介

JasperReports是一个用Java开发的开源报表库,它允许开发人员创建基于Java的丰富报表,这些报表可以与多种数据源交互,并可以很容易地集成到Java应用程序中。JasperReports提供了丰富的功能,如数据可视化、图表、子报表、参数化查询等,并支持多种输出格式,包括PDF、HTML、Excel、CSV等。

JasperReports主要由以下几个核心类组成:

  1. JasperReport:这是JasperReports的顶级类,用于创建报表。它提供了构建报表所需的所有方法。
  2. JRDataSource:这是一个接口,用于提供数据源,可以是数据库、文件、内存中的对象等。
  3. JasperPrint:表示报表生成的结果,包含了报表的所有元素,如标题、详细、页脚、图表等。
  4. JasperExportManager:用于将JasperPrint对象导出为不同的格式,如PDF、HTML、Excel等。
  5. 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&paramString=%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&paramString=%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&paramString=%7B%22od_id%22%3A9%7D
header:
    Accept: application/pdf
    App-Db-Name: xmsaas-gbs
    Db-Suffix: SYT230001

注意事项

  • 所有请求都必须提供 reportFileNameparamString 参数,否则会抛出 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 对象在请求体中。
  • jsonDataStringparamString 必须是有效的 JSON 字符串,否则将抛出 IOException
  • reportFileName 必须是有效的报告模板文件路径。

通过这些端点,用户可以利用 JSON 数据和参数来定制并生成所需的报告格式,满足各种业务需求。

7、VUE报表模板预览组件

组件名称:report_preview

此组件专为jasperReports报表模板提供预览和下载,预览和导出格式包括PDF、HTML、Word(DOCX)和Excel(XLSX)。它支持不同的操作模式(preview 和 test),并能处理数据库和JSON数据源。

Props

  • show: 布尔值,指示是否显示报表预览。
  • reportType: 报表的类型,可选值有pdfhtmlwordexcel,默认为pdf
  • viewMode: 预览模式,可选值有preview(预览)和test(测试),默认为preview
  • reportData: 报表数据,这是一个对象,包含以下字段:
    • report_name: 报表的名称。
    • report_file_name: 报表文件名。
    • report_parameters: 报表参数数组,每个元素是一个包含name(参数名)、data_type(数据类型,如IntegerStringFloat)和value(参数值)的对象。
    • report_datasource_type: 数据源类型,可以是databasejson
    • 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: 如果viewModepreview,则在组件挂载后立即调用预览方法。

方法

  • closeModal: 关闭组件的模态对话框。
  • toQueryString: 将对象转换为URL查询字符串。
  • getParameterString: 处理并返回报表参数的JSON字符串。
  • preview: 根据数据源类型调用相应的预览方法。
  • previewMysqlReport: 从数据库预览报表的方法。
  • previewJsonReport: 从JSON数据预览报表的方法。
  • ajax: 发送AJAX请求以获取报表数据,支持GET和POST方法。
  • fillFrame: 使用得到的数据填充报表,可以是在当前页面的<iframe>中展示或在新窗口打开。

注意事项

  • 该组件通过发送AJAX请求到特定的URL来获取报表数据,并且能够根据报表类型和预览模式正确处理响应数据。
  • 支持通过数据库或JSON数据源动态生成报表。
  • 预览功能既可在当前页面内实现,也可在新窗口中打开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值