Java 动态生成复杂 Word

时间:2021-07-04 18:20:26

Java 动态生成复杂 Word

阅读目录

1. 制作 Word 模版,将你需要动态生成的字段用${}替换。
2. 将 Word文档保存为 xml 。
3. 引入项目。

项目中需要用 java 程序生成doc 文件,百度一番,发现FreeMarker 的评价比较高。

FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出,至于想详细了解 FreeMarker 的请自行百度。

1. 制作 Word 模版,将你需要动态生成的字段用${}替换。如:${name}、${age}

Java 动态生成复杂 Word

2. 将 Word文档保存为 xml。

Java 动态生成复杂 Word

3. 引入项目。

将 xml 文件更改后缀名 为 .ftl, 然后引用到你的项目中。
Java 动态生成复杂 Word

需要注意的问题:
a. word 版本不能低于 2003 ,因为 2003 才开始支持 xml。

实现的代码如下:

package word;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map; import freemarker.template.Configuration;
import freemarker.template.Template; public class WordTest { private Configuration configuration = null; public WordTest() {
configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
} public void createWord() {
Map<String, Object> dataMap = new HashMap<String, Object>();
try {
dataMap.put("name", "guoxp");
dataMap.put("sex", "男"); configuration.setClassForTemplateLoading(this.getClass(), "/template"); // FTL文件所存在的位置
Template template = configuration.getTemplate("fz.ftl"); File outFile = new File("D:/temp2/wordTest2.doc");// D:/temp2这个路径下的temp2文件夹是手动创建的
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
template.process(dataMap, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
WordTest test = new WordTest();
test.createWord();
}
}

目录结构以及效果图如下:

Java 动态生成复杂 WordJava 动态生成复杂 Word

备注:

a. template.process(),接受一个 Map 和 输入流做为入参,Map 既是你需要动态生成到 doc 里面的数据,字段名必须与你在 .ftl 里面定义的一致;

b. 如果你想利用这段代码,需要有一个 .ftl 文件,并且在你的项目 src 目录下面新建 template 目录;

c.辅助文件"FreeMarker.jar 、实例项目的.ftl "。