Java Web项目中利用FreeMarker模板生成的word文档,其它格式文档同理,如pdf,txt,java,xml等等

    xiaoxiao2025-08-31  76

    利用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");     }

    效果如图:

    转载请注明原文地址: https://ju.6miu.com/read-1302178.html
    最新回复(0)