记录一下最近使用FreeMarker做的一个word导出功能。
1、首先创建一个需要的Word模板,${}里是要遍历的map数据的key值,l是由多个map组成的list的别名:
2、另存为xml格式,编辑xml文件
3、可以使用Notepad++打开xml文件,如果里面的数据是错乱的,可以使用在线格式化工具格式化xml代码。
生成xml后数据被打乱,进行手动调整。
4、
1)、遍历list循环生成行数据,list里存放多个map,list取别名l,#assign用于定义两个模板变量。
2)、这里的if-else就是简单的判断,l.subCenter=subCenter代表这两个值不相等是,添加合并开始,否则合并结束。
3)、如果list的值是空,则会直接报错,所以需要添加空值判断。
4)、找到对应的行尾添加对应的list结束标签
5、将文件改为ftl格式。
6、下面是代码实现。
public static void main(String[] args) throws IOException, TemplateException {
// 创建测试数据
List<Map> info = createInfo();
String fileName = "E:/_1/exportWord1.doc";// 存放的路径
String ftlPath = "E:/_1";
String ftlName = "exportWord.ftl";
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("list",info);
// 写入数据并导出word
exportWord(map,fileName,ftlPath,ftlName);
System.out.println("保存成功!");
}
/**
* 向模板中写入数据并生成新的word文件
* @param map 存放要写入的数据
* @param savePath 保存的文件路径
* @param ftlPath 模板路径
* @param ftlName 模板名称
* @throws IOException
* @throws TemplateException
*/
public static void exportWord(Map map, String savePath, String ftlPath,String ftlName) throws IOException, TemplateException {
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setDirectoryForTemplateLoading(new File(ftlPath));
Template t = configuration.getTemplate(ftlName);
File outFile = new File(savePath);
FileOutputStream fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");
Writer out = new BufferedWriter(oWriter);// 生成流
t.process(map,out); // 将数据和流生成模板文件
out.close();
fos.close();
}
7、导出效果