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


	}