java模板变量_java freemarker + word 模板 生成 word 文档 (变量替换,数据的循环,表格数据的循环,以及图片的替换)...

1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式

1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理就得整理半天,而且一旦要修改模板,那简直就是灾难,而且据说还不兼容 WPS

1.2,所以笔者找到了以下可以直接用 word 文档作为模板的方法,这里做以下笔记,以下代码依赖于 JDK8 以上

2,pom.xml 相应依赖

fr.opensagres.xdocreport

fr.opensagres.xdocreport.document.docx

2.0.1

fr.opensagres.xdocreport

fr.opensagres.xdocreport.template.freemarker

2.0.1

3,使用该模板的操作主要是IXDocReport 和 IContext 对象,封装两个工具类来对他们进行获取和操作

3.1,存放和设置插入到模板中的数据的模型类 ExportData,设置一般数据或者循环集合的时候比较简单,直接用 IContent 的 put(key,value)即可

但是设置 表格循环数据和图片等特殊数据就比较麻烦了,详情看下面 setTable 和 setImg

packagecom.hwq.utils.export;importcom.hwq.utils.model.SoMap;importfr.opensagres.xdocreport.document.IXDocReport;importfr.opensagres.xdocreport.document.images.ByteArrayImageProvider;importfr.opensagres.xdocreport.document.images.IImageProvider;importfr.opensagres.xdocreport.template.IContext;importfr.opensagres.xdocreport.template.formatter.FieldsMetadata;importorg.springframework.core.io.ClassPathResource;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.List;public classExportData {privateIXDocReport report;privateIContext context;/*** 构造方法

*@paramreport

*@paramcontext*/

publicExportData(IXDocReport report, IContext context) {this.report =report;this.context =context;

}/*** 设置普通数据,包括基础数据类型,数组,试题对象

* 使用时,直接 ${key.k} 或者 [#list d as key]

*@paramkey 健

*@paramvalue 值*/

public voidsetData(String key, Object value) {

context.put(key, value);

}/*** 设置表格数据,用来循环生成表格的 List 数据

* 使用时,直接 ${key.k}

*@paramkey 健

*@paramvalue List 集合*/

public void setTable(String key, Listmaps) {

FieldsMetadata metadata=report.getFieldsMetadata();

metadata= metadata == null ? newFieldsMetadata() : metadata;

SoMap map= maps.get(0);for(String kk : map.keySet()) {

metadata.addFieldAsList(key+ "." +kk);

}

report.setFieldsMetadata(metadata);

context.put(key, maps);

}/*** 设置图片数据

* 使用时 直接在书签出 key

*@paramkey 健

*@paramurl 图片地址*/

public voidsetImg(String key, String url) {

FieldsMetadata metadata=report.getFieldsMetadata();

metadata= metadata == null ? newFieldsMetadata() : metadata;

metadata.addFieldAsImage(key);

report.setFieldsMetadata(metadata);try(

Input

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot_Freemarker生成Word_多个表格+两层嵌套循环; 步骤说明: 1.用Microsoft Office Word打开word原件;将文档中需要动态生成的内容,替换为属性名 ${name} 2.另存为,选择保存类型Word 2003 XML 文档(*.xml) 3.用Firstobject free XML editor打开文件,选择Tools下的Indent【或者按快捷键F8】格式化文件内容。左边是文档结构,右边是文档内容; 4. 文档生成后有时需要手动修改,查找第一步中设置的属性名,可能会产生类似${n.....ame}类似的样子,我们将将名字中间的标签删掉,恢复为${name} 5. word模板中有表格,需要循环的位置, 用 标签将第二对 标签(即除表头的w:tr标签后的一对)包围起来 同时表格内的属性例如${name},在这需要修改为${user.name} (userList是集合在dataMap中的key, user是集合中的每个元素, 类似), 如图: PLUS:若表格之外还有嵌套的循环,也需要用,注意这的标签不要和某对其他标签交叉,不可以出现这种 6. 标识替换完之后,另存为.ftl后缀文件即可。 代码是相对有一丢丢复杂的,两层嵌套循环; 总(dataMap) deptName 部门名 list(Table)表的集合 table1(map) table-名字 ${map.table} tableName-中文名 ${map.tableName} columnCount-字段数 ${map.columnCount} recordCount-记录数 ${map.recordCount} listA-List--表格1 map.listA column Model属性——字段名 ${model.column} columnName Model属性——字段中文名 ${model.column} rate Model属性——字段占比 ${model.rate} nullValueCount Model属性——字段空值数 ${model.nullValueCount} listB-List--表格2 map.listB …… listC-List--表格3 map.listC …… table2 table-名字 ${map.table} tableName-中文名 ${map.tableName} columnCount-字段数 ${map.columnCount} recordCount-记录数 ${map.recordCount} listA-List--表格1 map.listA column Model属性——字段名 ${model.column} columnName Model属性——字段中文名 ${model.column} rate Model属性——字段占比 ${model.rate} nullValueCount Model属性——字段空值数 ${model.nullValueCount} listB-List--表格2 map.listB …… listC-List--表格3 map.listC …… table3 ……

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值