系列文章目录

第二章:根据模板导出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软件里面制作模板相关推荐

  1. Java解析word文档,将word文档题库选择题导入

    学习目标: Java解析word文档,将word文档题库导入 学会word文档的解析,以及各种题型的导入 学习内容: 解析word文档 获取正文文件内容 doc和docx两种解析 解析word文档 p ...

  2. 打开WORD文档时提示“word无法启动转换器mswrd632 wpc”的解决方法

    打开 WORD 文档时提示" word 无法启动转换器 mswrd632 wpc "的解决方法 因为之前安装的是精简版的 office 2003 ,导致系统找不到这个文件,出现标题 ...

  3. python操作word文档-python操作word

    1.Python写word文档 要操作word文档首先需要安装python-docx库: pip install python-docx 然后导入docx模块,或者从docx模块中导入Document ...

  4. 模板生成word文档 By POI+Word书签功能

    刚开始接到生成文档的时候,我的内心是拒绝的,脑海里回想起了苦痛挪位置调像素的jasper,和不停add各种style的POI.但是这个模块都归我~~~老子说了算赶紧上网搜搜有没什么easy way.看 ...

  5. 为什么Word文档无响应,Word文档无响应的解决方法

    如果在你进行打开Word文档的操作时,Word没有响应,可能的原因和对策如下. 一.文件名太长 虽然Word文档可以使用最长为255个字符的长文件名,但实际上如果Word文档的文件名加上其完整路径的字 ...

  6. java读取带格式word文档_Java读取word文档解决方案

    java读取word文档时,虽然网上介绍了很多插件poi.java2Word.jacob.itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用):java ...

  7. 计算机考试机试题目word文档,计算机考试 word

    2006年教师职称计算机考试试题(第5章) 第五章Word 2000文字处理软件 1.打开WORD文档一般是指(B) A把文档的内容从内存中读入并在屏幕上显示出来B把文档的内容从磁盘上调入内存并在屏幕 ...

  8. php打开word文档_PHP读取word文档的方法分享

    本文主要介绍PHP读取word文档的方法,较为详细的分析了COM组件的开启.属性设置及基于COM组件打开并读取word文档的操作技巧,需要的朋友可以参考下,希望能帮助到大家. php开发 过程中可能会 ...

  9. 支持恢复Word文档数据的数据恢复软件有哪些

    很多时候由于时间紧张或者是思路不想被打断,我们在编辑Word时不能及时的手动保存,一旦遇到电脑意外断电的情况可能就会导致编辑好的Word文档内容丢失.或者是文档编辑好了之后,Word提示是否保存时,误 ...

最新文章

  1. [裴礼文数学分析中的典型问题与方法习题参考解答]5.1.21
  2. 历数玩转光伏的IT巨头们
  3. iOS - UIRefreshControl 刷新数据
  4. 2019 蓝桥杯省赛 B 组模拟赛(一) 程序设计:后缀字符串 ( STL map 和 substr()函数的应用)
  5. TStrings的一些技巧(转)
  6. PyCharm主题自定义
  7. 【Luogu3444】ORK-Ploughing(贪心)
  8. 用cmd 查看本机的IP地址
  9. Octotree Chrome插件离线安装 树形展示插件
  10. 安卓txt极简记事本文件保存内部存储无广告
  11. 独家|数据造假、爬虫与反爬虫战争暴露出哪些行业现状?
  12. Modbus通讯协议(四)——Java实现ModbusTCP Slave(从机)
  13. 计算机学院杨洋,计算机学院
  14. 综述:视频和图像去雾算法以及相关的图像恢复和增强研究
  15. epub 电子书的制作
  16. RXJAVA-FlatMap
  17. 深度学习 学习笔记总结
  18. 动力电池罗生门:“无钴”的一张大网
  19. 『注册中心』Consul微服务注册中心的使用及相关集群搭建
  20. 抖音3d照片怎么制作html,抖音制作3D卡通小人怎么制作用什么软件 操作步骤介绍...

热门文章

  1. 伯恩半导体 - ESD 选型指南
  2. 完美修改证件照背景详细步骤,可以消除边界处的白边或者红边
  3. android高德轨迹纠偏,轨迹纠偏-服务-教程-地图 JS API | 高德地图API
  4. android.view.WindowLeaked的解决办法 has leaked window android.widget.PopupWindow$PopupDecorView
  5. 【生存游戏】一组按序排列围成一圈的参赛选手,通过逢3退1游戏机制筛选出最后一个生存者的Java算法
  6. mysql多次登录失败控制,Mysql登录失败多次锁定配置
  7. STM32笔记(十二)---SPI读写FLASH
  8. fastrcnn报错
  9. [译] 我无法想象没有 Git 别名的的场景
  10. 【Nmap】常用命令「一」——活跃主机发现