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