遇到需求需要对每一笔交易的 合同文件生成word文档保存。对 合同 内 关键字段 填充(比如说公司信息,人物名称,金额),其余内容不变。不需要生成复杂的word文件。
百度之后发现 用freemarker 模版生成 可以达成我的需求,而且比较简单。
步骤如下,下面是word文档内容,
1.在需要输入数据的地方加上变量
2. 另存为xml文件,这个就是生成word的模版文件
3.打开刚刚保存的xml文件,搜索 将所有变量 用${}包含起来
4.保存后,将后缀名改成ftl
5. 创建 DocUtil 类 里面(这里我将 模版文件放入src/conf目录下)
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
public class DocUtil {
private Configuration configure = null;
public DocUtil() {
configure = new Configuration();
configure.setDefaultEncoding("utf-8");
}
/**
* 根据Doc模板生成word文件
*
* @param dataMap
* Map 需要填入模板的数据
* @param fileName
* 文件名称
* @param savePath
* 保存路径
*/
public void createDoc(Map<String, Object> dataMap, String templateName,
String savePath) {
try {
// 加载需要装填的模板
Template template = null;
// 加载模板文件
configure.setClassForTemplateLoading(this.getClass(),
"/conf");
// 设置对象包装器
configure.setObjectWrapper(new DefaultObjectWrapper());
// 设置异常处理器
configure
.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
// 定义Template对象,注意模板类型名字与 模版 要一致
template = configure.getTemplate(templateName + ".ftl");
// 输出文档
File outFile = new File(savePath);
Writer out = null;
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), "utf-8"));
template.process(dataMap, out);
// outFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.创建测试方法调用
public static void main(String[] args) {
DocUtil docUtil= new DocUtil();
Map<String, Object> dataMap =new HashMap<String, Object>();
dataMap.put("shareName", "参数3");
dataMap.put("shareIdCard", "参数2");
dataMap.put("shareResidence", "参数1");
docUtil.createDoc(dataMap, "text", "生成新文件路径");
}