最近研究word文件导出,导出表格并且相同单元格合并,在数据量庞大的情况下性能较好
首先有两种思想,一种是poi导出,一种就是freemarker模板导出。首先说说poi的缺点吧,poi等于是用Java代码制作word模板,而且最不方便的就是poi对word很不友好,excel的各种方法应有尽有,word的少的可怜;而且代码繁琐,数量庞大,如果有其他同事需要编写相同的功能,需要把所有poi方法全部学习一遍,实在是太过麻烦,最终选择了使用freemarker
步骤1:创建模板
模板在创建时固定数据不变,需要循环遍历的数据写上你数据对应Map的key,数据封装应该是由Map<String,List<Map<String,Object>>>对应的数据就是list的别名 "." map的key。
步骤2:另存为xml格式文件
另存为保存的文件格式为xml文档,因为word的本身就是xml,注意不要导出2003版本,个人使用时导出2003版本数据可以正常导出,但是无法自动合并单元格 。(大家可以试一试,不知道是不是我的问题)
步骤3:编辑xml文件
另存为的xml文件可以用两种方式打开:
- 个人偏向于idea打开,因为格式化后代码可读性很高,关键字也有标注清楚
- 其次就是node++打开,用此方法打开时注意第三方插件格式化代码
在“可用”中搜索xml tools,这里因为我已经安装了
具体编辑方法如上图所示,有几列需要自动合并单元格,就添加几个变量,我是有两列,所有有两个变量,注意list和变量要写在你导出数据的单元格那一行标签上面,然后在这一行的结尾用list收尾
这一行收尾一般在tbl标签上方
步骤4:改变文件后缀名
改变文件后缀名为ftl
步骤5:添加依赖
maven的使用就不多言了,上依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
这里注意版本不能太低,不然很多底层代码会缺斤少两,出现很多问题
步骤6:Java工具类
/**
*
* @param map 导出的数据
* @param saveFilePath 储存的文件地址
* @param templatePath ftl模板路径
* @param ftlName ftl模板文件名
* @throws IOException 流异常,找不到文件
* @throws TemplateException 找不到ftl模板异常
*/
public static void setExportFree(Map<String, Object> map,String saveFilePath,String templatePath,String ftlName) throws IOException, TemplateException {
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
configuration.setDirectoryForTemplateLoading(new File(templatePath));
Template t = configuration.getTemplate(ftlName);
File outFile = new File(saveFilePath);
FileOutputStream fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
Writer out = new BufferedWriter(oWriter);
t.process(map, out);
out.close();
oWriter.close();
fos.close();
}
String templatePath = "D:/xxx/ftl";
String ftlName = "xxx.ftl";
Map<String, Object> map1 = new HashMap<>();
map1.put("infos", list);
String saveFilePath = "D:/xxx/my1.doc";
ExportFree.setExportFree(map1,saveFilePath,templatePath,ftlName);