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: Factoryat 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的坑 POI重复依赖相关推荐

  1. reportlab 库生成带有表格的PDF报表文件

    用reportlab 库生成PDF文件的确很方便,对于简单的PDF文件的生成,可以直接使用最基本的一些drawXXX()方法来实现,具有可参见我的另一篇文章(https://blog.csdn.net ...

  2. python 生成图片_python生成带有表格的图片

    因为工作中需要,需要生成一个带表格的图片 例如: 直接在html中写一个table标签,然后单独把表格部分保存成图片 或者是直接将excel中的内容保存成一个图片 刚开始的思路,是直接生成一个带有ta ...

  3. python生成带有表格的图片

    公众号:战渣渣 因为工作中需要,需要生成一个带表格的图片 例如: 直接在html中写一个table标签,然后单独把表格部分保存成图片 或者是直接将excel中的内容保存成一个图片 刚开始的思路,是直接 ...

  4. 前端实现生成带有样式的excel表格 Node和浏览器读写Excel文件探究实践

    最近碰到个需要自动生成表格的任务,作为前端的我,就想在 node 和浏览器中生成强大的表格,所以特此研究了很多关于表格的 npm 库 支持读写 Excel 的 node.js 模块 node-xlsx ...

  5. Word文档生成神器:开源项目poi.tl使用介绍

    导航: Word文档生成神器:开源项目poi-tl使用介绍 一. 概述 1.1 适合的场景 1.2 poi-tl的优势 二. poi-tl实例演示: 2.1 使用poi-tl生成word文档 三. 更 ...

  6. POI操作word模板并生成新的word.docx

    XWPFDocument对象 POI是apache提供的可以操作word文档的第三方jar.POI能操作word是使用XWPFDocument对象. XWPFDocument对象可以解析docx文件, ...

  7. Android word文档 poi 表格 段落使用记录

    需求:Android端根据数据,生成word保存到本地. 查了一些资料好像android 没什么正式的word操作库,基本都是用Java API,Apache POI实现的,但是这个版本比较多andr ...

  8. 【POI word】使用POI实现对Word的读取以及生成

    项目结构如下: 那第一部分:先是读取Word文档 1 package com.it.WordTest; 2 3 import java.io.FileInputStream; 4 import jav ...

  9. xwpftemplate的时间设置_数据导出生成word附件使用POI的XWPFTemplate对象

    比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel. Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多 ...

最新文章

  1. Python入门笔记(17):错误、异常
  2. 苹果手机还原网络设置会怎样_装维技巧|手机能连wifi但网不通?
  3. 光学模拟 Android,基于Android平台的光学字符识别应用的设计与实现
  4. 微信支付遇到的坑--签名错误
  5. 使用同步机制解决线程安全问题
  6. CallBack函数 回调函数
  7. CRM 客户端程序开发:设置实体表单界面字段的值
  8. 部署java项目到阿里云服务器(centos7版本)
  9. 【IDEA主题极致优化】全面优提升你的编码体验
  10. android jni stl,Android NDK中C++ STL库动态和静态链接
  11. 房贷新政或助楼市回暖 北京二手房两天涨10万
  12. 小程序图形验证码输入校验例子
  13. 网页禁止鼠标右键复制的解决办法
  14. 每日三省吾身- 持续改进-持续集成
  15. background-clip
  16. 电影院和计算机的英语怎么说,电影院英文,在电影院用英语in还是at!
  17. airpodspro窃听模式_AirPods怎么开启助听模式 实时收听设置方法介绍
  18. 晶振PPM,PPB单位换算
  19. manifest引用build中的变量
  20. 2022年将成为海外直播带货的发展元年?-跨境知道

热门文章

  1. 一张图读懂PBN飞越转弯衔接DF航段计算
  2. 小孢子:在?我用本地环境pytest带你玩自定义算子
  3. Paddle2.0实现PSPNet进行人体解析(图像分割)
  4. 软件测试未来主要发展的5个趋势
  5. RTD2173 USB-C Type-C/ DP 1.4 to HDMI 2.1 8K设计方案|替代RTD2173芯片|GSV6201可完全替代兼容 RTD2173
  6. Windows 12” 概念版下载,由B站UP主把 Win11 修改成 Win12
  7. R中 %in% 运算符取反
  8. Xshell不小心按到ctrl+s造成页面锁定的解决办法
  9. 麻将和牌源代码——java
  10. 使用VMware虚拟机安装Red Hat Enterprise Linux8/9教程