遇到需求需要对每一笔交易的 合同文件生成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", "生成新文件路径"); }