freemarker 使用word模版导出word

创建一个word.doc,如下图:


另存为XML格式,如下图:



将word.xml放入项目中,重命名为word.ftl,(list循环数据格式需要修正)

Configuration cfg=new Configuration();
cfg.setClassForTemplateLoading(FreeMarkerUtil.class,"/template");
cfg.setDefaultEncoding("utf-8");
cfg.setSharedVariable("indexOf",new IndexOfMethod());
cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250));
cfg.setOutputEncoding("utf-8");
cfg.setTemplateUpdateDelay(5);

cfg.setObjectWrapper(new DefaultObjectWrapper());

Template template=cfg.getTemplate("word.ftl");
Writer out = new OutputStreamWriter(new FileOutputStream(new File("D:/测试word.doc")));
Map<String,Object> map = new HashMap<>();
List<Map<String,Object>> list = new ArrayList<>();
for(int i = 0; i < 2; i++){
   Map<String,Object> m = new HashMap<>();
   m.put("name","沙发"+i);
   list.add(m);
}
map.put("titleName","哈哈");
map.put("list",list);
template.process(map,out);

(数据包含特殊字符需要转义)



如果freemarker富文本导出word,则word另存为mht文件,重命名为ftl文件后,修改其中的格式,并将字符串类型的数据编码改成3Dus-ascii格式;