POI-TL生成带有表格word的坑 POI重复依赖

poi-tl(poi template language)是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库。

官方文档:http://deepoove.com/poi-tl/
源码:https://github.com/Sayi/poi-tl

原项目中的maven依赖:

<!-- *************** poi start *************** -->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<!-- poi-tl -->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.10.3</version>
</dependency>
<!-- *************** poi end *************** -->

项目需求需要在导出的word中渲染表格
参考文档表格行循环:http://deepoove.com/poi-tl/#hack-loop-table
在这里插入图片描述

word模板格式:
在这里插入图片描述

配置{{table}}标签渲染策略:

LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder().bind("table", policy).build();
XWPFTemplate template = XWPFTemplate.compile(resource.getInputStream(), config).render(data);

生成带表格的word过程中,找不到方法

java.lang.NoSuchMethodError: org.openxmlformats.schemas.wordprocessingml.x2006
网上找了一下,各种论坛里面都是这一篇的中文翻译版
https://stackoverflow.com/questions/26854838/java-lang-nosuchmethoderror-org-openxmlformats-schemas-wordprocessingml-x2006-m
就是说 poi-ooxml-schemas 这个依赖是精简版的

poi相关依赖的作用:
https://poi.apache.org/components/index.html
在这里插入图片描述

尝试改用ooxml-schemas依赖
结果还是报错(跑偏了)

升级POI版本到5.2.2之后:
遇到了新的问题

Caused by: java.lang.NoSuchFieldError: Factory
    at org.apache.poi.xwpf.usermodel.XWPFDocument.onDocumentRead(XWPFDocument.java:196)
    at org.apache.poi.ooxml.POIXMLDocument.load(POIXMLDocument.java:169)
    at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:159)
    at com.deepoove.poi.xwpf.NiceXWPFDocument.<init>(NiceXWPFDocument.java:118)
    at com.deepoove.poi.xwpf.NiceXWPFDocument.<init>(NiceXWPFDocument.java:114)
    at com.deepoove.poi.XWPFTemplate.compile(XWPFTemplate.java:178)

在poi-tl Git仓库的Issues里面找到了同样的问题,作者回复是依赖冲突
https://github.com/Sayi/poi-tl/issues/737
在这里插入图片描述

poi-tl里面点进去可以看到(回到正确的方向了)
其实这个包里面已经包含了poi、poi-ooxml、poi-ooxml-schemas-extra这三个包。
与外面添加的poi相关依赖重复了

去掉多余的依赖,可以正常生成word了!
在这里插入图片描述

截取部分日志信息:

标签默认的渲染策略是:TextRenderPolicy
现在给{{table}}配置LoopRowTableRenderPolicy策略,渲染到指定标签时,会去渲染表格循环行的标签 [index]等

2022-05-20 09:47:37.977 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.DefaultRender.render:57 -Render template start...
2022-05-20 09:47:37.984 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.processor.LogProcessor.visit:57 -{{data}}
2022-05-20 09:47:37.986 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.processor.LogProcessor.visit:57 -{{bianShenQian}}
2022-05-20 09:47:37.987 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.processor.LogProcessor.visit:57 -{{table}}
2022-05-20 09:47:37.993 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.processor.ElementProcessor.visit:74 -Start render Template {{data}}, Sign: , policy:TextRenderPolicy
2022-05-20 09:47:38.024 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.processor.ElementProcessor.visit:74 -Start render Template {{bianShenQian}}, Sign: , policy:TextRenderPolicy
2022-05-20 09:47:38.024 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.processor.ElementProcessor.visit:74 -Start render Template {{table}}, Sign: , policy:LoopRowTableRenderPolicy
2022-05-20 09:47:38.028 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.buildRunEdge:218 -[index]
2022-05-20 09:47:38.028 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.loggerInfo:259 -[Start]:The run position of [index] is 0, Offset in run is 0
2022-05-20 09:47:38.028 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.loggerInfo:260 -[End]:The run position of [index] is 0, Offset in run is 6
2022-05-20 09:47:38.029 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.TemplateResolver.parseTemplateFactory:321 -Resolve where text: [index], and create RunTemplate for XWPFRun
2022-05-20 09:47:38.029 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.processor.ElementProcessor.visit:74 -Start render Template [index], Sign: , policy:TextRenderPolicy
2022-05-20 09:47:38.034 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.buildRunEdge:218 -[content]
2022-05-20 09:47:38.035 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.loggerInfo:259 -[Start]:The run position of [content] is 0, Offset in run is 0
2022-05-20 09:47:38.035 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.loggerInfo:260 -[End]:The run position of [content] is 0, Offset in run is 8
2022-05-20 09:47:38.035 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.TemplateResolver.parseTemplateFactory:321 -Resolve where text: [content], and create RunTemplate for XWPFRun
2022-05-20 09:47:38.035 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.processor.ElementProcessor.visit:74 -Start render Template [content], Sign: , policy:TextRenderPolicy
2022-05-20 09:47:38.037 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.buildRunEdge:218 -[index]
2022-05-20 09:47:38.037 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.loggerInfo:259 -[Start]:The run position of [index] is 0, Offset in run is 0
2022-05-20 09:47:38.037 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.loggerInfo:260 -[End]:The run position of [index] is 0, Offset in run is 6
2022-05-20 09:47:38.037 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.TemplateResolver.parseTemplateFactory:321 -Resolve where text: [index], and create RunTemplate for XWPFRun
2022-05-20 09:47:38.037 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.processor.ElementProcessor.visit:74 -Start render Template [index], Sign: , policy:TextRenderPolicy
2022-05-20 09:47:38.040 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.buildRunEdge:218 -[content]
2022-05-20 09:47:38.040 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.loggerInfo:259 -[Start]:The run position of [content] is 0, Offset in run is 0
2022-05-20 09:47:38.040 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.RunningRunParagraph.loggerInfo:260 -[End]:The run position of [content] is 0, Offset in run is 8
2022-05-20 09:47:38.040 DEBUG[http-nio-8052-exec-3]com.deepoove.poi.resolver.TemplateResolver.parseTemplateFactory:321 -Resolve where text: [content], and create RunTemplate for XWPFRun
2022-05-20 09:47:38.040 INFO [http-nio-8052-exec-3]com.deepoove.poi.render.processor.ElementProcessor.visit:74 -Start render Template [content], Sign: , policy:TextRenderPolicy

总结:poi-tl依赖里面已经包含了poi相关依赖 无需重复引用!!!

poi-tl是一个用于生成Word文档的Java模板引擎,它可以方便地创建和操作Word表格。在使用poi-tl生成Word表格时,你需要添加以下依赖到你的项目中: ```xml <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.10.0</version> </dependency> ``` 通过使用poi-tl提供的API,你可以轻松地创建和设置表格的样式。例如,如果你想要整行加粗,可以使用`textBold()`方法来设置行数据的样式。以下是一个示例代码: ```java RowRenderData titleRow = Rows.of(firstLine.getTitle(), null, null, null, null, null).textBold().create(); ``` 如果你想要指定特定单元格的样式,比如让表格中每一行的第二列内容加粗并且为红色字体,你可以使用以下方法: ```java CellStyle boldAndRedTextStyle = new CellStyle(); boldAndRedTextStyle.setDefaultParagraphStyle(ParagraphStyle.builder().withDefaultTextStyle(Style.builder().buildColor("FF00000").buildBold().build()).build()); for (RowRenderData rowRenderData : tableRenderData.getRows()) { rowRenderData.getCells().get(1).setCellStyle(boldAndRedTextStyle); } ``` 这样,你就可以使用poi-tl生成带有特定样式的Word表格了。 #### 引用[.reference_title] - *1* [java通过poi-tl模板引擎生成表格Word)](https://blog.csdn.net/qq_45731464/article/details/119247125)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[编程] POI-TL 根据模版生成Word文档的一些使用技巧汇总](https://blog.csdn.net/lmcboy/article/details/128216186)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值