前言
有一个需求就是给定一个正确格式的 Word 文档模板,要求通过动态赋值方式,写入数据并新生成 该模板格式的 Word 文档。这很明显使用 Java+freemarker 方式来实现颇为简单。
一、导入依赖
<!-- freemarker -->
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.30</version>
</dependency>
二、存入模板
(1)准备好一个正确格式的 Word 文档(测试文档 - 原版.docx)
(2)将其另存为xml文件(测试文档 - 原版.xml)
(3)随便找个在线 XML 格式化工具处理一下(测试文档 - 原版【格式化】.xml)
(4)将该 xml 模板存放在 /src/main/resources/templates/freemaker/ 目录中
(5)使用 EL 表达式对模板进行赋值
三、Xml 转 Doc/Docx
(1)/src/main/java/org/example/test/Main.java
import freemarker.template.Configuration;
import freemarker.template.Template;import java.io.*;
import java.util.HashMap;
import java.util.Map;public class ConvertXmlToDoc {/*** Xml 转 Doc*/private static void tranform() {Map<String, Object> map = new HashMap<>();map.put("question_1","一加一等于几");map.put("answer_1","二");map.put("question_2","什么叫余弦定理");map.put("answer_2","余弦定理,欧氏平面几何学基本定理。余弦定理是描述三角形中三边长度与一个角的余弦值关系的数学定理,是勾股定理在一般三角形情形下的推广,勾股定理是余弦定理的特例。");try {Configuration configuration = new Configuration(Configuration.VERSION_2_3_20);configuration.setClassForTemplateLoading(ConvertXmlToDoc.class, "/templates/freemaker"); // 指定 xml 模板存放的位置,即:项目目录/src/main/resources/templates/freemaker// 获取 xml 模板Template template = configuration.getTemplate("测试文档 - 原版【格式化】.xml");// 输出 doc/docx 文件File outFile = new File("D:/" + "测试文档 - 修订版【重制版】" + ".docx");Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));template.process(map, out);System.out.println("转换成功");} catch (Exception e) {System.out.println("转换失败");e.printStackTrace();}}public static void main(String[] args) {tranform();}
}