近期项目中部分数据要求word导出,苦于将word文档另存htm或编写jsp页面,导出后的文件不能100%与原文件一致,借助jacob调用msword dll技术,要求服务器端必须安装office,而且技术难度大等原因,最终采用xml(word另存xml)+ FreeMarker技术完美实现word文档导出功能,详细步骤如下:
1.打开word文档,另存为xml文件,如下图:
2.编辑该xml文件,添加freemarker标签,再将该xml文件另存为ftl文件。
3.编写java代码填充模板数据,输出最终word文档。
代码参考:
Configuration cfg = new Configuration();
cfg.setDefaultEncoding("UTF-8");
cfg.setOutputEncoding("UTF-8");
cfg.setLocale(Locale.US);
String tempDir = "F:/workspace/CaspDemo/war/template";// 定义模板存放路径
String tempName = "FlightQueryRequest.ftl";// 定义模板名
String outputName = "F:/workspace/CaspDemo/war/template/test.doc";// 定义输出文件名
cfg.setDirectoryForTemplateLoading(new File(tempDir));
Template temp = cfg.getTemplate(tempName,"UTF-8");
Map<String, Object> map = new HashMap<String, Object>();
map.put("userID", "lamfire");
map.put("departureDateTime", "1010-8-8");
LPMVO lpmVO=new LPMVO();
map.put("lpmVO",lpmVO);
// 定义生成文件
File output = new File(outputName);
Writer writer = new FileWriter(output);
temp.process(map, writer);
注:遍历类对象私有属性及属性值
Class clazz = map.get("lpmVO").getClass();
Field[] f = clazz.getDeclaredFields();
String[] name = field2Name(f);
Object[] value = field2Value(f, map.get("lpmVO"));
public static String[] field2Name(Field[] f) {
String[] name = new String[f.length];
for (int i = 0; i < f.length; i++) {
name[i] = f[i].getName();
}
return name;
}
public static Object[] field2Value(Field[] f, Object o) throws Exception {
Field.setAccessible(f, true);
Object[] value = new Object[f.length];
for (int i = 0; i < f.length; i++) {
value[i] = f[i].get(o);
}
return value;
}