使用FreeMaker将数据库内容以指定文件格式导出
1.首先你得有一个word模板,将需要填充的内容用占位符进行填充${括号里的值是后台创建map的key}
注意${}里面装的是一个list,那么list是map的key值,info对应list里面的属性,也就是你想循环打印的内容
2.将文件以xml的方式进行导出
3.然后放入idea中将文件后缀改为ftl结尾
4.注意ftl里面的格式有些不对需要手动调整,找到文件里面各个key的位置,可以ctrl+f快速定位
5.将${leader}中间多余的删除变成如下图
6.如果你 {}里面装的是list则需要循环删除多余的部分后,再整段的前后加上<#list 你map里Value为list的key as 这个as后面的随意相当于循环每个变量的名字> 但下面 也要改变${自己取的随意变量.属性}
7.开始代码编写
//docMap装的是你数据库查出来的值
Map docMap = new HashMap();
docMap.put("dutyTime",dutyTime);
docMap.put("list",maps);
Writer out = null;
FileInputStream in = null;
//filePath是你文件的相对路径
String filePath = "相对路径.doc";
try {
//Configuration 用于读取ftl文件
Configuration configuration = new Configuration(new Version("2.3.8"));
configuration.setDefaultEncoding("utf-8");
configuration.setDirectoryForTemplateLoading(new File("你把文件放到的文件夹的路劲"));
//以utf-8的编码读取ftl文件
Template template = configuration.getTemplate("dutyrecord.ftl", "utf-8");
FileUtil.createFile(filePath);
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), "utf-8"), 10240);
//这一步就是填充内容
template.process(docMap, out);
//下载文件
downOneFile(filePath);
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(out);
}
public void downOneFile(String fileName) throws Exception {
HttpServletResponse resp = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
File file = new File("文件夹的相对路径" + fileName);
if (file.exists()) {
resp.setContentType("application/x-msdownload");
resp.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO-8859-1"));
InputStream inputStream = new FileInputStream(file);
ServletOutputStream ouputStream = resp.getOutputStream();
byte b[] = new byte[1024];
int n;
while ((n = inputStream.read(b)) != -1) {
ouputStream.write(b, 0, n);
}
ouputStream.close();
inputStream.close();
}
}
最后的下载功能因个人而异,发现错误多多包涵。