java Web导出word完美解决方案

近期项目中部分数据要求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;
 }

你可能感兴趣的:(Java Web)