使用FreeMarker导出docx格式word文档全过程

使用FreeMarker导出docx格式word文档全过程,第1张

SpringBoot借助FreeMarker通过word模板生成.docx文件快速入门,推荐博客文章

java代码完全参考以上那篇文档足以,需求就是word模板中只插入文字,不插入图片。
如果需要考虑插入图片,综合考虑以下这两篇文档,综合地来看
文档1
文档二

坑点
  1. 准备word模板文档的时候,不要在word文件中直接写${}表达式,而是在将.docx转换成.zip并解压后的document.xml中写入。(具体看本篇博客最开始推荐的入门文档)
    解答:在写word文档时,直接写你要替换的通用字符串,不要把 ${ } 插值表达式写进去,这是因为我们最终是要保证.docx文件解压后的.zip中的document.xml中包含 ${“需要替代的字符串”}是连续的一串字符串。如果直接在word文件(即.docx文件)中写入 ${“需要替代的字符串”} ,在word解压时会把 ${ } 当做特殊字符串分割成一个一个的。
    连续 ${“需要替代的字符串”} 意思指的是这些符号在一个< w:t>< /w:t>之中

    完整的插值表达式 不在一个< w:t>< /w:t>之中的样子

FreeMarker语法(包括插值表达式 ${ })

  1. 如何找到文件File当前目录下的根目录?
    在new File(“文件路径”),获取文件的相对路径是从该项目的根路径开始。
    注意:如果这个项目属于父子项目中的子项目,相对路径也是从父项目根目录开始。
    举例子:

  2. InputStream与OutputStream区别?
    首先以内存为中心,然后看流的方向,从内存写向磁盘或网络是out
    从外部读向内存是in。

  3. FreeMarker中Template类中process方法Map参数的键和值具体代表什么?
    这个参数的键就是document.xml的插值表达式的参数,如上面例子中的${docuemntName},这里键就是“docuemntName”这个字符串。
    而值就是要替换“ ${docuemntName}”整个插值表达式的内容。
    参考

  4. 转义字符 导致 word .docx文档无法正常打开

在Configuration configuration = new Configuration(Configuration.VERSION_2_3_30);
创立了Configuration对象之后,加入这行代码

configuration.setOutputFormat(XMLOutputFormat.INSTANCE);

这行代码大概原理如下:
freemarker导出word时,> < &符号被当做是ftl的标签,打开自然报错,

而上面那行代码行是设置 > < & 这列符号在编码时进行自动转义,把 “<” 转义成 “< ;”把 “>” 转义成 “> ;” 把 “&” 转义成 “& ;” 故可以正常打开。

详情看freemarker在word成文时换行、空格、字符转义处理

  1. (承接上一个坑点)但是这样又出现了一个新问题,就是我想把document.xml中的/n换成word可以识别的换行符,但是上面的设置因为会把所有< 和 > 符号进行转义,所以变成了< ;w:br/> ; 而使得不能成为被识别的ftl标签,而产生换行效果,反而是直接在文本中输出< ;w:br/> ;。

注:< ;和> ; 中,<以及>分别于字符;之间其实是没有空格的,但是在csdn编辑中,如果中间不加空格会直接被转义生成 < , > ,故只能加空格。

解决办法:如果需要有把/n换成word可以识别的换行符的需求,则不用上面configuration.setOutputFormat(XMLOutputFormat.INSTANCE);代码区设置特殊字符转义,而是自己对输入字符串的特殊字符直接替换,这样可以控制转换的先后顺序。

text.replaceAll("&", "&");
text.replaceAll("<", "<"); 
text.replaceAll(">", ">");
text.replaceAll("\n", "<w:br/>");

这样的目的是先将文本中的特殊字符 “<” 、“&” 、“>” 先转义后,再去转义\n为,这样里面的< > 就不会被转义了。所以就能够变成一个ftl的换行标签被识别,从而在word中体现换行效果。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/791551.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存