因为在做项目的时候要涉及到导出Word,所有网上找了些资料,大部门的人都是使用FreeMarker制作模板,在导出Word。
但是在导出的时候遇到个问题,因为导出的路径我都是在JAVA代码中写好的,但是这样肯定是不行的,然后在网上找了一些资料,看到也是比较多人遇到这个问题的,但是都没有什么解决的结果。得到的结果大多是叫我换另一种方式导出。这样的话跟逃避有什么区别。所有我就结合导出Excel的方式,通过如下代码可以解决这个问题。
/**
* 导出Word的操作方法
*
* @param objects 元模型ID,支持批量上传
* @throws Exception
*/
public void createWord(List<Object> objects, HttpServletRequest request, HttpServletResponse response) throws Exception {
//获取ftl文件的路径
String patha = ExprotWord.class.getResource("/").toString();
patha = patha.substring(0, patha.lastIndexOf("/"));
patha = patha.substring(0, patha.lastIndexOf("/"));
patha = patha.substring(0, patha.lastIndexOf("/"));
patha = patha.substring(0, patha.lastIndexOf("/"));
patha = patha.substring(patha.indexOf("/") + 1, patha.lastIndexOf("/"));
//最终得到的路径
String sourcePath = patha + "/src/main/template";
configuration.setDirectoryForTemplateLoading(new File(sourcePath)); // FTL文件所存在的位置
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
Template t = null;
try {
t = configuration.getTemplate("exprotWord.ftl"); // 文件名
} catch (IOException e) {
e.printStackTrace();
}
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/msword");
String resultUrl = "对象类型清单_" + sf.format(new Date()) + ".doc";
//防止文件名含有中文乱码
resultUrl = new String(resultUrl.getBytes("gb2312"), "ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + resultUrl);
response.getWriter();
//存放的目标路径
// File outFile = new File(resultUrl);
Map<String, Object> dataMap = new HashMap<String, Object>();
getData(dataMap, objects);
Writer out = null;
try {
// out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
out = response.getWriter();
// 必须加 "utf-8" 不然在 UserInfoRestController 通过webservice的方式调用 生成的文件 打开
// 不了,会报错(而当做java程序去运行,则没有"utf-8"生成的文件也能正常打开的),原因不详
// 规范编写应该是要加上文件的编码的"utf-8"
} catch (Exception e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
out.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String resultUrl = "对象类型清单_" + sf.format(new Date()) + ".doc";这段代码是点击导出的时候弹窗展示的