利用FreeMarker模板生成的word文档,其它格式文档同理,如pdf,txt,java,xml等等
需要向项目中加入freemarker的JAR文件,可以通过下面的链接获得Freemarker的最新版本:
http://freemarker.org/freemarkerdownload.html
实现思路如下:
1、把要生成的模板文件填入freemarker的占位字段如:${test.id}另存为.xml的文件.
2、用notepad++打开,把中间多余部分删掉,因为有的时候你写的占位符可能会被拆开,这样Freemarker就无法处理了。
3、保存成.ftl格式,放在指定文件夹
4、在Java类中调用freemarker模板引擎生成
此外,如果你希望在Word文档中插入图片,可以把Word另存为的XML文件中代表图片的那个很长的字符串(BASE64编码的字符串)换成一个占位符,在将要插入Word文档的图片对象转换成BASE64编码的字符串,用该字符串替换掉占位符就可以了
具体代码如下:
controller层:
@Autowired @Qualifier("freeMarkerConfigurer") private FreeMarkerConfigurer freeMarkerConfigurer; public FreeMarkerConfigurer getFreeMarkerConfigurer() { return freeMarkerConfigurer; } public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) { this.freeMarkerConfigurer = freeMarkerConfigurer; }
@ActionAnnotation(name = "生成函調報告1文档并下载", group = "查询") public ModelAndView createWord1(HttpServletRequest request, HttpServletResponse response) throws Exception { Management management = managementService.query(request.getParameter("mm_id")); Map<String, Object> model = new HashMap<String, Object>(); model.put("management", management); String view = SystemParameter.get("soldier"); Template template = freeMarkerConfigurer.getConfiguration().getTemplate(SystemParameter.get("tempDirSoldier") + "/soldier.ftl", "utf-8"); String temp = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); File file = new File(getServletContext().getRealPath(view)); FileUtils.writeStringToFile(file, temp, "utf-8"); response.setContentType("text/html; charset=GBK"); response.setContentType("application/x-msdownload"); //设置response的编码方式 response.setContentLength((int) file.length()); //写明要下载的文件的大小 response.setHeader("Content-Disposition", "attachment;filename=" + new String(view.getBytes("gbk"), "iso-8859-1"));//解决中文乱码 FileInputStream fis = new FileInputStream(file); //创建输入流 BufferedInputStream buff = new BufferedInputStream(fis); //创建文件缓冲 OutputStream out = response.getOutputStream(); byte[] b = new byte[1024]; //设置缓冲大小 long k = 0; //用于判断文件长度是否为0 while (k < file.length()) { int j = buff.read(b, 0, 1024); k += j; // 累计文件长度 out.write(b, 0, j); } out.flush(); //将文件数据刷新到用户名电脑上 fis.close(); out.close(); file.delete(); // 删除临时文件 return responseText(response, "1"); }
效果如图: