springboot下生成复杂word文档方案 在Word软件里面制作模板
系列文章目录
第二章:根据模板导出word,复合格式表格生成、可变列表格生成
第三章:doc和docx插入多图
第四章:web环境下word文档预览
springboot freemarker 生成复杂word
- 系列文章目录
- 代码仓库
- 1. 制作word模板
- 1.1 制作一个word文档,设置好样式、排版
- 1.2 正常保存为word docx/doc文档留底
- 1.3 另存为一份Word XML 文档(*.xml)
- 2. 准备一个springboot项目,引入freemarker-starter依赖
- 3. 调整配置文件
- 4. 编辑模板文件
- 4.1 将第1步的word xml 文档放到指定的模板目录
- 4.2 格式化模板文件
- 4.2.3 修改文件后缀名为.ftl
- 4.3 将word文件中要动态替换的内容用freemarker占位符替换
- 4.3.1 艺术字文字内容
- 4.3.2 图片
- 4.3.3 表格处理
- 5. 写代码
- 运行测试
- 6.结果
- FreeMarker官方在线手册中文版
- 最佳实践
- word兼容性问题
- 2次格式化可能会出现的问题
- 分页符处理
为什么不用POI或者easypoi来做呢?
1.POI需要用太多代码来实现格式,如果在用户给定一个word模板,开发人员需要观察每个部分的格式、布局等来写代码,在复杂场景下效率太低。
2.easypoi无法实现细致的格式控制。如:一个表格第一行(标题行)宽边框,从第二行(内容行第一行)细边框,最后一行粗边框;这个应用场景比较多,但是easypoi无法实现。另外就是缺失了图片功能。
使用模板引擎来做生成word文档的优势在于:
1:可视化编辑模板,可以让产品经理或者具体的业务人员制作模板。
2:降低了代码量和调试难度,因为不用写代码来控制格式。
缺点:
1:每一次word样式调整都需要重新再次转换为模板引擎的模板。
这个Demo覆盖了动态带格式的文字、图片、表格。在实际的复杂格式word文档场景下,使用模板引擎是比POI、easypoi更优的解决方案。如果是比较简单的word文档区别不大。
代码仓库
https://gitee.com/whatitis/springboot_freemarker_word
1. 制作word模板
1.1 制作一个word文档,设置好样式、排版
直接在word文档里面写freemarker占位符是没有用的,因为${}字符会被转换。
1.2 正常保存为word docx/doc文档留底
1.3 另存为一份Word XML 文档(*.xml)
这个是用于作为freemarker模板。
2. 准备一个springboot项目,引入freemarker-starter依赖
gradle
implementation 'org.springframework.boot:spring-boot-starter-freemarker:2.5.5'
TODO:贴上项目仓库地址
3. 调整配置文件
spring:freemarker:template-loader-path: classpath:/templates/word/
wordDemo:outDirectory: D:/temp # word文件输出目录basePackagePath: /templates/word/ # 自定义模板目录
4. 编辑模板文件
通过word另存为xml格式的文档,我们只需要在此基础上调整、增加一点代码就可以使用了。
4.1 将第1步的word xml 文档放到指定的模板目录
4.2 格式化模板文件
4.2.3 修改文件后缀名为.ftl
4.3 将word文件中要动态替换的内容用freemarker占位符替换
4.3.1 艺术字文字内容
我们按照关键字搜索到指定位置
这个艺术字有两处需要去替换,因为带有阴影效果。
将内容改为:${articleTitle}
4.3.2 图片
找到图片位置
可以看出来它是用base64来存储图片的,所以我们相对应的也用base64替换。
把原来的base64内容替换成占位符
4.3.3 表格处理
按照关键字搜索
user.name替换为:
user.gender段多了一些没用的代码,应该是一些多余的样式,删掉和user.name保持一致即可。
写循环代码
通过观察word xml代码,我们分析得知
user.name 所处的 <w:tr 标签段为表格中的一行,我们在其上写循环代码,这个就像JSP。
<#list> </#list>要包住 <w:tr></w:tr>
全部替换完毕之后保存。
5. 写代码
请看代码仓库里的内容。
https://gitee.com/whatitis/springboot_freemarker_word
运行测试
cn.gitee.worddemo.WorddemoApplicationTests#testProc
6.结果
1.艺术字替换完成
2.表格内容填充完成,样式保持OK。
3.页码自动生成。
测试通过。
FreeMarker官方在线手册中文版
http://freemarker.foofun.cn/dgui_template_directives.html
最佳实践
为了减少每一次word样式调整转换为模板引擎的模板时的工作量,可以视具体情况用最小部分替换法去做,这个方式需要你去识别word的xml标签,来决定替换的范围,比如某一页的内容格式修改了之后,就用这一页的xml替换ftl对应那一页的标签然后再去重新写freemarker标签。
word兼容性问题
如果需要在office word 2007 以及之前的版本上使用生成的结果,需要使用word xml 2003 格式来做模板。不然会出现生成的结果没法在老版word上打开的问题。
2次格式化可能会出现的问题
在制作word 2003 xml模板过程中,导入word xml格式到IDEA中,格式化一次,重命名文件为ftl之后再格式化一次,使用此模板生成的word doc 文档会出现图片不显示或者文档打开失败的情况。
这种情况下,只在导入word xml 到IDEA中格式化一次,然后手动格式化具体标签就不会出现问题。
在做word 2007模板时没有出现问题。
分页符处理
段落分页的处理;
1.如果分页符是段落前面需要判断是否第一页,不然会多出一个空白页。
2.如果分页符位于段落后面需要判断是否最后一页,不然会多出一个空白页。
分页符是需要依附于某个元素的,比如一段文字,如下:
<w:p wsp:rsidR="00230078" wsp:rsidRDefault="00415FB0"><w:pPr><w:jc w:val="center"/><w:rPr><w:b/><w:sz w:val="24"/><w:sz-cs w:val="24"/></w:rPr><#-- 判断是否第一页--><#if ttable_index != 0><w:br w:type="page"/></#if></w:pPr><w:r><w:rPr><w:rFonts w:hint="fareast"/><wx:font wx:val="宋体"/><w:b/><w:sz w:val="24"/><w:sz-csw:val="24"/></w:rPr><w:t>我是一段文字,啦啦啦啦啦</w:t></w:r></w:p>
复合格式表格生成,请看第二章
在文章开头有链接
springboot下生成复杂word文档方案 在Word软件里面制作模板相关推荐
- Java解析word文档,将word文档题库选择题导入
学习目标: Java解析word文档,将word文档题库导入 学会word文档的解析,以及各种题型的导入 学习内容: 解析word文档 获取正文文件内容 doc和docx两种解析 解析word文档 p ...
- 打开WORD文档时提示“word无法启动转换器mswrd632 wpc”的解决方法
打开 WORD 文档时提示" word 无法启动转换器 mswrd632 wpc "的解决方法 因为之前安装的是精简版的 office 2003 ,导致系统找不到这个文件,出现标题 ...
- python操作word文档-python操作word
1.Python写word文档 要操作word文档首先需要安装python-docx库: pip install python-docx 然后导入docx模块,或者从docx模块中导入Document ...
- 模板生成word文档 By POI+Word书签功能
刚开始接到生成文档的时候,我的内心是拒绝的,脑海里回想起了苦痛挪位置调像素的jasper,和不停add各种style的POI.但是这个模块都归我~~~老子说了算赶紧上网搜搜有没什么easy way.看 ...
- 为什么Word文档无响应,Word文档无响应的解决方法
如果在你进行打开Word文档的操作时,Word没有响应,可能的原因和对策如下. 一.文件名太长 虽然Word文档可以使用最长为255个字符的长文件名,但实际上如果Word文档的文件名加上其完整路径的字 ...
- java读取带格式word文档_Java读取word文档解决方案
java读取word文档时,虽然网上介绍了很多插件poi.java2Word.jacob.itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用):java ...
- 计算机考试机试题目word文档,计算机考试 word
2006年教师职称计算机考试试题(第5章) 第五章Word 2000文字处理软件 1.打开WORD文档一般是指(B) A把文档的内容从内存中读入并在屏幕上显示出来B把文档的内容从磁盘上调入内存并在屏幕 ...
- php打开word文档_PHP读取word文档的方法分享
本文主要介绍PHP读取word文档的方法,较为详细的分析了COM组件的开启.属性设置及基于COM组件打开并读取word文档的操作技巧,需要的朋友可以参考下,希望能帮助到大家. php开发 过程中可能会 ...
- 支持恢复Word文档数据的数据恢复软件有哪些
很多时候由于时间紧张或者是思路不想被打断,我们在编辑Word时不能及时的手动保存,一旦遇到电脑意外断电的情况可能就会导致编辑好的Word文档内容丢失.或者是文档编辑好了之后,Word提示是否保存时,误 ...
最新文章
- [裴礼文数学分析中的典型问题与方法习题参考解答]5.1.21
- 历数玩转光伏的IT巨头们
- iOS - UIRefreshControl		刷新数据
- 2019 蓝桥杯省赛 B 组模拟赛(一) 程序设计:后缀字符串 ( STL map 和 substr()函数的应用)
- TStrings的一些技巧(转)
- PyCharm主题自定义
- 【Luogu3444】ORK-Ploughing(贪心)
- 用cmd 查看本机的IP地址
- Octotree Chrome插件离线安装 树形展示插件
- 安卓txt极简记事本文件保存内部存储无广告
- 独家|数据造假、爬虫与反爬虫战争暴露出哪些行业现状?
- Modbus通讯协议(四)——Java实现ModbusTCP Slave(从机)
- 计算机学院杨洋,计算机学院
- 综述:视频和图像去雾算法以及相关的图像恢复和增强研究
- epub 电子书的制作
- RXJAVA-FlatMap
- 深度学习 学习笔记总结
- 动力电池罗生门:“无钴”的一张大网
- 『注册中心』Consul微服务注册中心的使用及相关集群搭建
- 抖音3d照片怎么制作html,抖音制作3D卡通小人怎么制作用什么软件 操作步骤介绍...
热门文章
- 伯恩半导体 - ESD 选型指南
- 完美修改证件照背景详细步骤,可以消除边界处的白边或者红边
- android高德轨迹纠偏,轨迹纠偏-服务-教程-地图 JS API | 高德地图API
- android.view.WindowLeaked的解决办法 has leaked window android.widget.PopupWindow$PopupDecorView
- 【生存游戏】一组按序排列围成一圈的参赛选手,通过逢3退1游戏机制筛选出最后一个生存者的Java算法
- mysql多次登录失败控制,Mysql登录失败多次锁定配置
- STM32笔记(十二)---SPI读写FLASH
- fastrcnn报错
- [译] 我无法想象没有 Git 别名的的场景
- 【Nmap】常用命令「一」——活跃主机发现