用润乾报表外部库生成复杂格式报表

SPL 不仅可以做数据准备和计算,还可以调用润乾报表的外部库来生成有格式要求的报表

外部库环境配置

  • 设计器下载及安装

    润乾官网下载报表设计器,解压缩后直接安装,安装后自带试用授权,如需其他版本授权,可以在官网申请。

  • 配置外部库

    在 SPL【安装根目录】\esProc\ 下新建 extlib\Report5Cil 目录(也可以将 Report5Cil 放到其他目录下,在 SPL 工具中设置时能找到相应目录就行)

    将报表设计器【安装根目录】\report\lib 下的 jboss-servlet-api_3.1-1.0.0.jar 复制到 SPL 新建的 Report5Cil 中

    在报表设计器【安装根目录】\report\web\webapps\demo\WEB-INF\lib 中找到如下 jar 包:

    esproc-ext-********.jar(* 代表不同版本发布日期)

    htmlparser-1.6.jar

    pdfbox-1.8.14.jar

    mail-1.4.4.jar

    raqsoftReport.jar

    scu-report5-cli-2.10.jar

    将上述 jar 包复制到 SPL 新建的 Report5Cil 中

    启动集算器,在菜单栏中选择【工具】-【选项】-【环境】,进入如下界面:

    imagepng

    确定后重启集算器

    报表设计器【安装根目录】\report\config 下的 raqsoftConfig.xml,该文件中可以配置数据源连接、报表模板根目录等信息。本文例子使用 SPL 安装后自带的配置文件(【SPL 根目录】\config 下的 raqsoftConfig.xml),配置可不做更改。如需要个性化设置,则将报表设计器自带的 raqsoftConfig.xml 放到本机其他目录进行修改,然后 SPL 中读取配置文件时读取新的配置文件就行。

案例

  • 数据结构
    先看下数据来源,数据源存储在《订单信息.xlsx》中,里边记录了订单信息数据,如下图:

    imagepng

    要求从这个 Excel 中取数生成各类复杂格式报表,将该 Excel 放到 F 盘。

    :本文中所涉及到的 Excel 数据文件、报表文件均放到了 F 盘,实际使用时可以根据自身情况自行设置,只需要在报表设计、SPL 读取所涉及到的目录的地方根据实际需要进行替换就行。导出的报表结果放到了 D 盘,用于方便查看,同样可以改成目录。

动态样式行式报表

  • 需求

    从《订单信息.xlsx》取出数据以列表方式呈现,要求数据区域单元格背景色隔行异色、并且将订单金额超过 2000 的数据行用红色字体标出,结果如下:

    imagepng

  • 报表设计

    数据集设置

    新建数据集,数据集类型“文件数据集”,文件选择《订单信息.xlsx》

    imagepng

    imagepng

    数据集名称这里用默认的 ds1,在报表模板设计时单元格表达式通过这个名称从数据集中取数,并且在 SPL 脚本中进行数据替换时也是根据这个数据集名称进行替换。

    注:报表支持多数据集,这里可以增加多个数据集设置。下述其余案例数据集设置方式相同均是相同设置方式。

    报表模板设计

    imagepng

    报表第三行是数据扩展区域,在第三行单元格的背景色表达式中写入公式:if(row()%2==0,-4417,-853778),该公式判奇偶行来返回不同的颜色值,在第三行的前景色表达式中写入公式:if(C3>2000,-65536,-16777216),判断如果订单金额大于 2000 则设置前景色为红色(前景色和背景色属性是每一个单元格的属性,所以要在第三行所有单元格的前景色和背景色表达式中写入表达式)。

    报表文件保存到 F 盘,命名为 "订单明细.rpx"。

  • 编写 SPL 脚本

    A B
    1 =file("F:/ 订单信息.xlsx").xlsimport@t() // 读入 excel 数据
    2 >report_config("config/raqsoftConfig.xml") // 读取配置文件信息
    3 =report_open("F:/ 订单明细.rpx") // 读取报表文件
    4 =report_run(A3;A1:"ds1") // 将 A1 中的数据作为报表中 ds1 数据集的结果
    5 =report_exportXls@x(A3,"D:\ 订单明细.xlsx") // 导出 excel 文件

    A1:=file("F:/ 订单信息.xlsx").xlsimport@t(),读取 F 盘下的订单信息.xlsx 并通过 xlsimport 函数将其转换成 SPL 中的序表,@t 参数表示 Excel 第一行为字段名称。

    注:本例中报表设计时和 SPL 读取用的同一个 Excel 文件,实际使用时,两个文件可以不同,报表设计时主要读取 Excel 的结构来制作报表,SPL 中读取真实数据做数据注入,如要不同文件保证两个 Excel 的第一行字段名称相同。

    A2:>report_config("config/raqsoftConfig.xml") 读取配置文件信息,此处使用相对路径(相对于 SPL 安装根目录),也可以使用绝对路径。

    A3:=report_open("F:/ 订单明细.rpx"),读取报表文件,这里可以用绝对路径,如在 raqsoftConfig.xml 配置报表模板根目录的话,将报表文件放到配置文件所指定位置,此处可以直接使用报表名称。

    A4:=report_run(A3;A1:"ds1"),运算报表,A1 是读取 Excel 生成的序表结果,ds1 是报表设计时定义的数据集名称,报表运算时会用 A1 的序表结果替换报表中的 ds1 数据集。

    注:SPL 中运算报表时可以进行数据集数据的替换,报表设计时 ds1 数据集、SPL 中 A1 的序表两个数据来源可以任意设置,只要保证两方数据结构相同就行(字段名称、数据类型)。

    A5:=report_exportXls@x(A3,"D:\\ 订单明细.xlsx"),将结果生成 Excel 文件放到 D 盘(可以指定其他位置),此处也可以生成 pdf 以及 html 文件,按照实际需要使用相应的函数就行。

  • 查看结果

    打开 D 盘下的订单明细.xlsx 查看结果:

    imagepng

分组带明细及统计

  • 需求

    从《订单信息.xlsx》取数,要求结果按照地区、城市进行分组统计,列出明细数据,并按照地区、城市对订单金额做汇总统计生成如下 Excel 文件:

    imagepng

  • 报表模板设计

    imagepng

    前两列按照地区、城市分组扩展,设置合并单元格,C3 单元格通过 select 函数以列表方式取数扩展,D3、D4 单元格中对订单金额进行汇总操作。报表命名为 "汇总统计.rpx"。

  • 编写 SPL 脚本

    A B
    1 =file("F:/ 订单信息.xlsx").xlsimport@t() // 读入 excel 数据
    2 >report_config("config/raqsoftConfig.xml") // 读取配置文件信息
    3 =report_open("F:/ 汇总统计.rpx")) // 读取报表文件
    4 =report_run(A3;A1:"ds1") // 将 A1 中的数据作为报表中 ds1 数据集的结果
    5 =report_exportXls@x(A3,"D:\ 汇总统计.xlsx") // 导出 excel 文件
  • 查看结果

    imagepng

固定格式带扩展

  • 需求

    以卡片形式展示订单信息,方便导出 excel 的后的套打操作,并且按照订单编号进行循环能够实现批量打印,结果如下:

    imagepng

  • 报表模板设计

    imagepng

    B1 单元格按照订单编号扩展,然后将 A 列所有单元格的左主格设成 B1。报表命名为“订单打印.rpx”。

    注:本例订单信息打印可以批量打印在空白纸张上,所以位置要求不用太过精确,如支票等带格式纸张打印,那么可以先将纸张扫描成图片,在报表中将图片做为背景图插入,按照图片格式去设置各个单元格的具体位置,能够实现带格式纸张的精确打印。

  • 编写 SPL 脚本

    A B
    1 =file("F:/ 订单信息.xlsx").xlsimport@t() // 读入 excel 数据
    2 >report_config("config/raqsoftConfig.xml") // 读取配置文件信息
    3 =report_open("F:/ 订单打印.rpx") // 读取报表文件
    4 =report_run(A3;A1:"ds1") // 将 A1 中的数据作为报表中 ds1 数据集的结果
    5 =report_exportXls@x(A3,"D:\ 订单打印.xlsx") // 导出 excel 文件
  • 查看结果

    imagepng

交叉分片

  • 需求

    从多个维度对订单金额进行汇总统计,要求纵向按照员工维度、横向按照地区、产品类别两个维度分片统计,并且按照年份循环,每年的数据保存到单独的 Excel 文件中,形成如下结果:

    imagepng

  • 报表模板设计

    增加参数

    报表中增加参数 rq,用于接收年份参数:

    imagepng

    报表模板设计

    imagepng

    A4 按照员工名称纵向扩展,B 列按照货主地区、货主城市横向分组扩展,C 列按照类别横向分组扩展,B4、C4 对订单金额汇总。

    报表命名为 "汇总分析.rpx"。

  • 编写 SPL 脚本

    A B C
    1 =file("F:/ 订单信息.xlsx").xlsimport@t() // 读入 excel 数据
    2 >report_config("config/raqsoftConfig.xml") // 读取配置文件信息
    3 =report_open("F:/ 汇总分析.rpx") // 读取报表文件
    4 [2012,2013,2014,2015] // 设置年份循环列表
    5 for A4 // 按照年份循环
    6 =A1.select(year( 订购日期)==A5) // 对数据按照年份过滤
    7 =report_run(A3,A5:"rq";B6:"ds1") // 计算报表,将 B6 过滤后的数据传入 ds1 数据集,并将年份传递给 rq 参数
    8 =report_exportXls@x(A3,"D:/ 汇总分析 /"+string(A5)+"年汇总分析.xlsx") // 将结果保存到 D 盘子目录汇总分析下,文件命名前增加年份
    9 =report_exportPdf(A3,"D:/ 汇总分析 /"+string(A5)+"年汇总分析.pdf") // 生成 pdf 文件

    A4:[2012,2013,2014,2015],设置循环列表,此处可以手动设置列表,也可以通过 SPL 函数返回个序列以实现动态设置。

    A5:for A4,按照 A4 的值进行循环,循环体内,通过 A5 可以获取每次循环对应的 A4 的值。

    B6:=A1.select(year( 订购日期)==A5),通过 select 函数对序表 A1 进行过滤,循环取出对应年份的数据,year 函数为取日期格式的年份。

    B7:=report_run(A3,A5:"rq";B6:"ds1"),将 B6 过滤后的序表传递给报表中的 ds1 数据集,将循环 A5 的年份传递给报表中定义的参数 rq 的值。

  • 查看结果

    imagepng

    imagepng