什么是poi-tl poi-tl是一个Word模板引擎,它基于Word模板和数据生成新文档。Poi-tl会保留文档模板中的样式。官网上的描述“在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海”。不过需要注意的是目前poi-tl仅支持docx类型的word文档生成,不支持doc类型。
why poi -tl 方案 移植性 功能性 易用性 Poi-tl Java跨平台 Word模板引擎 基于Apache POI,更友好的API Apache POI Java跨平台 Apache项目,不仅封装了易用的文档API(文本、图片、表格、页眉、页脚、图表等),也可以在底层直接操作XML结构 文档不全 Freemarker XML跨平台 仅支持文本,很大的局限性 不推荐,需要维护XML结构,代码后期不可维护 OpenOffice 部署OpenOffice,移植性较差 – 需要了解OpenOffice的API HTML浏览器导出 依赖浏览器的实现,移植性较差 HTML不能很好的兼容Word的格式 – Jacob、winlib Windows平台 – 复杂,完全不推荐使用 表格来源于poitl官网
使用poi-tl生成文档 引入依赖 文档模板 {{appendices}}是一个标签,绑定的是appendices对象,而{{?appendices}}{{/appendices}}则构成一个区块对,以?标识开始,以/标识结束。区块对中间的appendices是一个list集合,当然也可以包含图片、表格、段落等。区块对中的文档元素根据?appendices可以被渲染0次、1次或n次。如果?appendices为false或空集合,则隐藏区块中所有文档元素,非false且不是集合,渲染一次,非空集合集合循环渲染。 dictionaryEntities.size()>0是一个表达式,如果为true就会遍历dictionaryEntities。我们把dictionaryEntities声明为一个LoopRowTableRenderPolicy对象,它是一个特定场景插件,会循环遍历表格行。中括号[codeNo]中的codeNo为dictionaryEntities集合对象中的属性名。 数据 数据可以是map、字典、树结构、对象等类型。我这里模版中的appendices,dictionaryEntities是List集合。dictionaryCode在文档中需要被设置成锚点,前文中引用CC0100004,从而实现点击跳转。 渲染数据 生成文档 代码高亮 再看一下如何使用poi-tl实现代码高亮。先引入poi-tl提供的代码高亮插件。 然后创建HighlightRenderData对象。这里有一个注意的点,如果代码高亮绑定的数据是一个empty的list对象,最后在渲染数据的时候就会抛出异常,但是异常信息并不会说明是代码高亮绑定的数据为empty的原因。所以在处理数据的时候,如果数据是空的,也需要给一个默认的值。 最后渲染一下数据,导出文档,就可以实现代码高亮啦。 poi-tl官网地址:Poi-tl Documentation (deepoove.com)
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.1</version>
</dependency>
HyperlinkTextRenderData link = new
HyperlinkTextRenderData(value, \"anchor:\"+dictionaryCode);
LoopRowTableRenderPolicy loopRowTableRenderPolicy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind(\"Appendices\",loopRowTableRenderPolicy)
.bind(\"dictionaryEntities\",loopRowTableRenderPolicy)
.useSpringEL() //设置标签为Spring表达式
.bind();
XWPFTemplate template = XWFTemplate
.compile(intputStream,config)//配置
.render(data); //数据
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl-plugin-highlight</artifactId>
<version>1.0.0</version>
</dependency>|
private HighlightRenderData processHighlightCode(DocumentDefinitionEntity request,
Map<String,List<DaDocumentDefinitionCideEntity>>collectCodeMap){
List<DaDocumentDefinitionEntity> requestDefinitionCode = collectCodeMap.get(request.getId);
HighlightRenderData definitionCode = new HighlightRenderData();
if(CollUtil.isEmpty(requestDefinitionCode)){
//如果为空,也要给一个透明主题的代码块,不然渲染数据时会报错
HightlightStyle idea = HighlightStyle.builder().withShowLine(false).withThema(\"idea\").build();
definitionCode.setCode(\" \");
definitionCode.setLanguage(\"json\");
definitionCode.setStyle(idea);
return definitionCode;
}
definitionCode.setCode(requestDefinitionCode.get(0).getDefinitionCode());
definitionCode.setLanguage(MessageEnum.of(request.getType()));
definition.setStyle(codeStyle);
return definitionCode;
}
HighlightRenderPolicy highlightRenderPolicy = new HighlightRenderPolicy();
Configure config = Configure.builder()
.bind( \"requestParam.requestDefinitionCode\",highlightRenderPolicy)
XWPFTemplatetemplate = XWPFTemplatecompile(inputStream, config)
.render(transactionTreeTable);//渲染数据
End 文章作者:鲍启凡 封面设计:Lina
?
原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/33566.html