使用FreeMarker导出docx格式word文档全过程(使用template模板)

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的标签,打开自然报错,

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

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

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

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

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

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

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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我不是一个视觉机器人,无法提供图片。不过,我可以为您提供使用Freemarker导出Word文档的代码实现和总结。 代码实现: 1. 导入相关依赖包 ```java <!--freemarker--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> <!--poi--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.0</version> </dependency> ``` 2. 编写模板文件 在Word中编辑好需要导出的文档,并保存为.ftl文件。 3. 实现导出功能 ```java public void export() { // 获取模板文件 String templatePath = "src/main/resources/template.ftl"; File templateFile = new File(templatePath); // 加载模板文件 Configuration configuration = new Configuration(Configuration.VERSION_2_3_28); configuration.setDefaultEncoding("UTF-8"); try { configuration.setDirectoryForTemplateLoading(templateFile.getParentFile()); Template template = configuration.getTemplate(templateFile.getName()); // 定义数据模型,用于模板中填充数据 Map<String, Object> dataMap = new HashMap<>(); dataMap.put("title", "导出文档标题"); dataMap.put("content", "导出文档内容"); // 创建Word文档 XWPFDocument document = new XWPFDocument(); // 填充模板数据 StringWriter writer = new StringWriter(); template.process(dataMap, writer); String content = writer.toString(); IOUtils.closeQuietly(writer); // 将填充好的模板内容写入Word文档中 XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText(content); // 保存Word文档 String savePath = "src/main/resources/export.docx"; FileOutputStream outputStream = new FileOutputStream(savePath); document.write(outputStream); IOUtils.closeQuietly(outputStream); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } } ``` 总结: 1. Freemarker是一款模板引擎,可以实现将数据填充到模板中生成动态内容。 2. POI是一款开源的Java Office API,可以实现对Word、Excel等Office格式文件的读写操作。 3. Freemarker和POI结合使用,可以实现将动态数据填充到Word模板中并导出Word文档。 4. 在模板中插入图片时,可以在模板使用<img>标签,然后在代码中将图片添加到Word文档中即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值