模板管理

模板说明

  • 原理: 是基于excel模板生成对应打文件格式(pdf,htm,excel 等格式)输出到浏览器模板既可以作为打印的报表模板也可以作为数据导出的模板(导出格式:html、csv、pdf、excel、word)
  • 设计步骤:在报模板管理中 [新增]->[导入]。 设计好的excel打印模板导入到模板管理中, 设计器中使用[打印]组件,[数据导出]组件关联设计好的模板来使用。
  • 模板下载:

批注命令

快搭平台的报表是基于 jxls 增强的指令,更符合业务报表的设计; 降低了原生的jxls的很多命令的复杂度同时增加了一些常用的指令让模板设计更简单灵活.

jx:area(lastCell=”D4”) 指定区域是设计打印区域 在这区域内是有效的报表设计区域

  • lastCell: 必须参数, 设计区域最后一个单元格
  • 例子:
    • 在[批注的单元格,D4]的区域是设计报表区域
        jx:area(lastCell="D4")

jx:each(items=”employees”var=”employee” lastCell=”D4”) 循环遍历employees数据对象

  • lastCell: 必须参数, 遍历区域最后一个单元格
  • items: 必须参数, 遍历的数据对象
  • var: 必须参数, 遍历时候单个数据对象的别名
  • 例子:
    • 在批注的单元格增加分页符号
        jx:each(items="master",var="M",lastCell="F8")

jx:pageBreak() 当前单元格加入分页符号 就是强制报表分页

  • 例子:
    • 在批注的单元格增加分页符号
      jx:pageBreak()

jx:image([src=”imageBytes”],[url=”/static/filesres/ico/81/81FA6EF8EA2F4A19B679866EFA0A2967.png”] ,[imageType=”PNG”]) 当前的单元格增加一个图片。图片格式:

  • lastCell: [可选参数] 图片区域的的最后一个单元格,会自动拉伸填充完你定义的格子。比如你在A1中加入了这个批注,lastCell写C6,就会把A1到C6都拉伸填充完,如果不设置就是当前单位格
  • field:可选参数 。 字段表达式,主要是用于数据库字段保存有图片路径,在模板需要展示图片时候使用
  • 支持的格式:

    1. web路径

      https://www.baidu.com/img/flexible/logo/pc/result.png

      https://www.baidu.com/

    2. 文件相对路径 如:(注意不能带有ContextPath)

      /static/appdata/filesres/model/71/7121D274C79E4C04A169B5A77C2FC0BA.jpg
    3. json对象字符串 如:

      {
      "newFileName":"/static/appdata/filesres/model/71/7121D274C79E4C04A169B5A77C2FC0BA.jpg",
      "oldFileName":"u=1486189403,2248332545&fm=26&gp=0.jpg",
      "hasUpload":true
      }
    4. json数组字符串 如:

      [
      {
      "newFileName":"/static/appdata/filesres/model/71/7121D274C79E4C04A169B5A77C2FC0BA.jpg",
      "oldFileName":"u=1486189403,2248332545&fm=26&gp=0.jpg",
      "hasUpload":true
      }
      ]
    5. 图片的base64字符串 如:

      data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACwSURBVDhP7ZNBDcQgEEV/N3tvHRQnRQIOkAAOCBJQQh2ABBxgoQ5YhoS9NGlKusd9yT8wMB8YBoQQCmOsABiS1roQ07quZADOeY3f4zgOOOfgvW/jYoxpbiP0vFezeMBU1a5AGiHGiHoCvGlQ64Bt29oEYa2FlPLSlAw6pxpQjF7nip73uAZ/g18ZUG+P0NcvywIopb4/bETzPJecc5moKfZ9R0qpxu9BOwshaqcyfABWv7l2knc5+AAAAABJRU5ErkJggg==
  • src: [可选参数] 可以转化成字节数组的表达式 ,是model中传入的字节数组byte[]
  • url: [可选参数] 图片的地址,可以是相对地址或者完整的http地址
  • algin: 可选参数 图片的对齐方式: leftTop(左上角),center (居中)
  • sizeType: 可选参数 图片的填充方式: auto, fill(拉伸填充)
  • 例子:
    • 在当前单元格显示图片:/static/filesres/ico/81/81FA6EF8EA2F4A19B679866EFA0A2967.png
      jx:image(url="/static/filesres/ico/81/81FA6EF8EA2F4A19B679866EFA0A2967.png")
    • 在单元格[批注的单元格,B8]的区域显示图片:/static/filesres/ico/81/81FA6EF8EA2F4A19B679866EFA0A2967.png
      jx:image(lastCell="B8", url="/static/filesres/ico/81/81FA6EF8EA2F4A19B679866EFA0A2967.png")
    • 在单元格[批注的单元格,B8]的区域显示http图片: https://www.baidu.com/img/flexible/logo/pc/result.png
      jx:image(lastCell="B8", url="https://www.baidu.com/img/flexible/logo/pc/result.png")
    • 显示数据库字段 pic字段图片 格式:web路径 、文件相对路径(注意不能带有ContextPath)、json对象字符串、json数组字符串,base64图片字符串
      jx:image(field="mx.pic")
    • 居中显示图片并保持图片的高宽比例. 需要平台版本: 5.0.235以上
      jx:image(field="mx.pic" algin="center" sizeType="auto")
    • 注意: 参数的优先级:field > url > src

jx:if(condition=”employee.payment <= 2000”, lastCell=”F9” , areas=[“A9:F9”,”A18:F18”]) 根据判断来选择输出的区域

  • lastCell:[必须参数] 区域的的最后一个单元格,
  • condition:必选参数 。条件布尔逻辑表达式
  • areas :必须参数。 输出的区域
  • 例子:



jx:barcode(src=”M.RWID”,size=32,imageType=”PNG) 生成一个二维码,

  • lastCell: 必须参数, 二维码存放的位置为当前批注的单元格到 lastCell单元格
  • src:[必须参数] 生成二维码的内容
  • size:[必须参数] 二维码的大小像素
  • 注意:二维码模糊或者拉伸:二维码由于要填满单元格会缩放图片,因此 size参数要与单元格的大小相近这样才不会拉伸二维码图片
  • 例子:
  • 二维码输出批注的单元格
    jx:barcode(src="M.RWID",size=32,lastCell="B6",imageType="PNG)

jx:barcode(src=”M.ZDMX_BIANH”,format=”CODE_39”,lastCell=”??”) 生成一个一维码

  • lastCell: 必须参数, 一维码存放的位置为当前批注的单元格到 lastCell单元格
  • src:[必须参数] 生成一维码的内容
  • format: [可选参数] 默认:QR_CODE; 一维码的编码格式 : CODE_39,CODE_93,CODE_128,EAN_8,EAN_13,ITF,UPC_A,UPC_E
    • CODE_39 : 数字0-9、大写字母A-Z和特殊字符-. *$/+%
    • CODE_93 : 数字0-9、大写字母A-Z和特殊字符-. $/+%abcd*
    • CODE_128 : 数字0-9、大写字母A-Z和特殊字符$、+、-、.、/。
    • EAN_8 : 8位数字组成的唯一标识符;数字0-9
    • EAN_13 : 13位数字组成的唯一标识符;数字0-9
    • UPC_A : 12位数字组成的唯一标识符;数字0-9
    • UPC_E : 12位数字组成的唯一标识符;数字0-9
  • width: [可选参数] 一维码的宽带 默认 :60
  • height: [可选参数] 一维码的高度 默认 :30
    jx:barcode(src="M.ZDMX_BIANH",format="CODE_39",lastCell="D3")

jx:mergesame(direct=’col’,fields=’field1,field2’) 合并内容相同的单元格

  • direct: [可选参数] 默认:col. 合并的方向。 。可选值:col(列合并) 、row (行合并)
  • fields: [可选参数] 默认:’’. 设置合并分组字段 只在分组内合并。(注意: 这个需要平台2.0.236 以上才支持这个参数)
  • 注意:该命令只能放到each命令内部才生效。
  • 例子:
  • 列相同的内容合并
    jx:mergesame()
    jx:mergesame(direct="row")
    jx:mergesame(fields="RWID,OBJNAME")

jx:merge(lastCell=”D4”,row=”3”,col=”2”) 当前的行开始合并指定的行/列。

  • lastCell:[必须参数] 最后一个单元格
  • row:[必须参数] 合并的行数
  • col:[必须参数] 合并的列数
  • text:[可选参数] 默认值:’’. 展示的标题
  • 例子:
  • 合并 3行,2列

    jx:merge(lastCell="D4",row="3",col="2")

    数据源设置

    报表数据源设置是在excel的报表的第二个单元格设置批注编写groovy脚本返回Map类型

    数据源换行符\后面不能带任何东西,否则解析脚本会出错

    ret=newHashMap<String,Object>();
    //主表数据
    master=cxt.exceSelectSql("SELECT ZDMX_MINGC,\
        ZDMX_BIANH, \
        ZDMX_LEIX, \
        ZDMX_GUANLBM, \
        ZDMX_SUOSXT, \
        SYS_MODIFYTIME, \
        RWID, \
        SYS_CREATOR, \
        SYS_CREATETIME, \
        SYS_MODIFYBY, \
        SYS_SORT, \
        SYS_AUDFLAG, \
        SYS_STATUS \
    FROM CORE_DICTIONARY where SYS_CREATOR=#{UserId}",userId);
    //从表数据
    Detail=cxt.exceSelectSql("SELECT B.* \
    FROM CORE_DICTIONARY A \
    INNER JOIN CORE_DICTIONARYMX B \
        ON A.RWID = B.ZDZ_DICTIONARYID \
    WHERE A.SYS_CREATOR=#{UserId}",userId);
    
    //关联主从数据
    cxt.masterDetial(master,"RWID",Detail,"ZDZ_DICTIONARYID","MX")
    
    //这里加入进去才能让excel模板内使用
    ret.put("master",master);
    
    return ret;                                     

参数说明

报表引擎在执行数据源脚本前会把一些常用的参数写入上下文,方便脚本上使用,默认参数见下表格
除了默认参数也可以自定义参数,就是在报表链接上加上自定义参数,如:http://127.0.0.1:20003/kdayun/manager/corereport/reportserver?reportid=4489B56BFE1943EE8414ECB5324905F0&op=write&userDefinevariable=xxxx 其中 userDefinevariable 就是用户需要传递的参数到报表模板内

  • 默认参数 :
    • userId 当前登录用户id
    • username 当前登录用户名
    • deptId 当前登录部门id
    • deptName 当前登录部门名称
    • orgId 当前登录机构id
    • orgName 当前登录机构名称
    • cxt ScriptContext 的实例里面包含了很多脚本常用的函数
    • format 报表的输出格式,默认pdf,有xls,xlsx,csv,html 如果要导出对应的格式,请使用链接/manager/corereport/getreportfile,参数与manager/corereport/reportserver一致

      打印设计调试

  • 在设计之前请在excel选择对应的打印

  • 设计完成效果图

  • 设置注意点:
    兄弟标签打印机需要设置页面是横向打印

不要通过分页预览方式来调整分页,这样调整的分页是无效的。而且还会产生不是预期的效果

如果在分页预览内调整了分页需要“取消打印区域“来清除设置的分页符

在使用打印路径导出excel后使用excel打开分页预览

如果出现下图需要重新调整模板到所有的内容都在一个页面上

打印路径说明

报表打印路径为[contextPath]/manager/corereport/reportserver?reportid=[reportid],可支持get,post方式

reportid:报表的唯一id,这个id新增时候生成,以后就固定使用该id查询报表

注意事项

  • 模板如果设置了分页预览会导致打印出来的页错乱

  • 数据源脚本的sql语句尽量保证sql通用标准

  • 数据源必须有一个返回值

  • 打印出错:请设置第二个单元格数据源。解决:把对应数据源的批注隐藏

  • PDF中文乱码的原因
    为什么PDF的中文会出现乱码呢? 主要的原因是操作系统的字体缺失.情况常见于linux操作系统.

    • PDF解决办法
      以Centos系统为例,Centos的默认字体没有他名字中的那个字,于是就直接被忽略了。其实那个字并不生僻,于是不得不安装中文字体,安装过程也很简单,记录一下。
      安装的思路是将windows中的字体拷贝到centos中,然后执行几个命令即可。
      windows xp中字体位于C:/WINDOWS/Fonts目录中,每中字体一个文件,比如simsun.ttc
      centos中的字体文件位于/usr/share/fonts/,每种字体一个目录,比如wqy-zenhei
      安装过程是,首先在centos的/usr/share/fonts/目录下新建simsun目录
      然后将windows中的simsun.ttc拷贝到/usr/share/fonts/simsun目录

      #mkdir /usr/share/fonts/simsun
      ##拷贝windows中的simsun.ttc到/usr/share/fonts/simsun/
      
      ##然后执行以下命令
      
      #cd /usr/share/fonts/simsun
      #mkfontscale
      #mkfontdir
      #fc-cache -fv
      ##执行以下命令让字体生效
      #source /etc/profile

      为了让应用程序重新使用新的字体,你可能需要重启平台服务

    • 工作流中文乱码解决办法 :
      给JDK添加字体

      1. linux的jdk的fonts下创建目录fallback
        [root@localhost jre]# cd /opt/module/jdk1.8.0_144/jre/lib/fonts
        [root@localhost jre]# mkdir fallback
        [root@localhost jre]# cd fallback
      2. 上传Windows字体文件
        将C:\Windows\Fonts下面对应的字体上传到linux服务器JDK的/opt/module/jdk1.8.0_144/jre/lib/fonts/fallback 目录下.
        如:(宋体:simsun.ttc)文件上传即可
      3. 重启平台服务即可
作者:admin  创建时间:2022-12-05 16:59
最后编辑:admin  更新时间:2024-10-17 08:28