根据word模板生成word内容(JAVA)

主要是借助 poi-tl 来实现业务需求

当时第一次尝试的是Apache poi不是很好用,不推荐

第二次是xml,找的眼睛都花了,不推荐

要求:jdk1.8+,Apache POI5.2.2+ 我这里使用的是5.2.3版本

文档:Poi-tl Documentation

java 复制代码
<!-- Apache POI  -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.12.2</version>
        </dependency>

注意这里需要确保没有其他的版本的poi,否则项目启动会报找不到类等错误,例如出现 java.lang.NoSuchFieldError:Factory

解决方式:此问题是由pom依赖导致,通过Ctrl+N查看ThemeDocument类,出现多个版本,发现引入了两个不同版本的poi包,导致版本冲突。

其中NoSuchMethodError 、ClassNotFoundException 、NoClassDefFoundError异常都是版本不对的问题,需要升级版本


代码部分

java 复制代码
// 利用map结构存储数据
            Map<String, Object> data = new HashMap<>();
// 指定路径 compile 编译模板 render添加数据源
XWPFTemplate template = XWPFTemplate.compile("xxx.docx").render(data);

  try {
                //write 输出到流
                template.writeAndClose(new FileOutputStream(输出路径"));
            } catch (IOException e) {
                e.printStackTrace();
                log.error("写入文件出错了");
            }

模板部分,使用poi-tl最大的难点或者说工作量在于模板的制作,具体可以看上面文档,文档中拥有具体格式。

  • 普通替换,只需要{{属性名}}
  • 逻辑判断是否显示:{{?属性名}}...{{/属性名}}
  • 列表{{*列表名}} 在这里,我单纯只使用了List<String>,文档中有更复杂的形式,包括对象
  • 表格我这里没有涉及到,不做考虑
相关推荐
平头哥技术团队3 分钟前
Day 16 | 用 ul、ol、li 一个标签,把散资料收成有序的技能清单页
开发语言·前端·html·html5
统计学小王子12 分钟前
数学建模国赛倒计时 2 天 ——《统计模型精讲(广义线性模型 R 语言实例 + 分析)》
开发语言·数学建模·r语言
用户31268748772014 分钟前
线程池到底怎么管理线程的?从 ThreadPoolExecutor 到拒绝策略全链路拆解
java
此冬歌咏20 分钟前
自动化服务器运维监控系统(python+shell)
linux·运维·服务器·开发语言·python·自动化
cpolar技术支持29 分钟前
Kafka Streams 窗口统计怎么验收:本地跑订单流聚合,用 cpolar 给同事看只读结果页
java·docker·kafka·cpolar·kafka streams
爱读源码的大都督37 分钟前
DeepSeek面试官问:生产RAG系统回答不准确,该如何定位和优化?这样回答,能让面试官当场给你Offer!
java·后端·python
Cx330❀39 分钟前
【Linux网络】深入TCP协议:从滑动窗口到拥塞控制与性能优化全景解析
linux·开发语言·网络·tcp/ip·ai·性能优化·ai编程
“AI国潮设计-小江”1 小时前
【Python实战】SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
k4m7v2pz1 小时前
从 Python 搬到 Rust:pyglet MIDI DAW 变成 egui 鬼畜采样器的迁移复盘
开发语言·python·rust
C++ 老炮儿的技术栈1 小时前
MFC CPtrArray的用法
开发语言·数据结构·c++·算法·mfc·c