使用freemarker导出word并动态插入多张图片

第一步:制作freemarker模板



文件另存为xml



然后将xml文件重命名为ftl


接下来修改ftl文件内容主要将图片位子换成动态可读取


第一个红色框是组员签字动态读取,第二个是组长签字需要读取

后面的内容需要和这里的id想对应

如下图:




 其中:<#if listLeadUrl?? && (listLeadUrl?size > 0) >  这个是非空判断,防止传入的list为空,模板会报错。signUrl是图片的路径

还有最后一个地方需要修改:


第二步:java代码




代码片段:


@RequestMapping("/print")    public void exportWordBook(@RequestParam Map<String,Object> map,HttpServletResponse response) throws BaseException, TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException {List<Map<String,Object>> list = expertAssignService.getList(map);Map<String,Object> dataMap=new HashMap<String,Object>();if (list != null && list.size() > 0) {        dataMap.put("companyName", map.get("companyName"));        List<Map<String,Object>> listMemUrl = new ArrayList<>();        List<Map<String,Object>> listLeadUrl = new ArrayList<>();for (Map<String, Object> map2 : list) {if ("1".equals(map2.get("isAccept")) && StringUtils.isNotNullOrEmpty(map2.get("signUrl"))) {String signUrl = (String)map2.get("signUrl");String url = env.getProperty("file.api.props.xydl-store-root-path", "/dmp/gfsmnt/xydl/fileCenter")+signUrl.replaceAll(env.getProperty("file.api.props.xydl-image-uri", "http://192.168.0.45"), "");Map<String,Object> mp = new HashMap<>();        mp.put("signUrl", url);            File file = new File(url);            FileInputStream fis = new FileInputStream(file);            byte[] imgData = new byte[fis.available()];            fis.read(imgData);            fis.close();            String headPortrait = new Base64().encodeAsString(imgData);            mp.put("imageBase64", headPortrait);            if ("0".equals(map2.get("isLeader"))) {// 组员            listMemUrl.add(mp);            } else {            listLeadUrl.add(mp);            }}}        dataMap.put("listMemUrl", listMemUrl);        dataMap.put("listLeadUrl", listLeadUrl);        this.createWord(dataMap, response);} else {this.createWord(dataMap, response);}    }        /**     * 功能说明:创建word文档并返回给浏览器     * @param dataMap     * @param response     */    public void createWord(Map<String,Object> dataMap,HttpServletResponse response){          Template t=null;          try {              t = configuration.getTemplate("secrecyAgree.ftl"); //获取模板文件        } catch (IOException e) {              e.printStackTrace();          }          File file = null;        InputStream fin = null;        ServletOutputStream out = null;        try {            // 调用工具类的createDoc方法生成Word文档            file = createDoc(dataMap,t);            try {fin = new FileInputStream(file);} catch (FileNotFoundException e) {e.printStackTrace();}            response.setCharacterEncoding("utf-8");            response.setContentType("application/msword");            // 设置浏览器以下载的方式处理该文件名            String fileName = "保密协议.doc";            try {response.setHeader("Content-Disposition", "attachment;filename="        .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));} catch (UnsupportedEncodingException e) {e.printStackTrace();}            try {out = response.getOutputStream();} catch (IOException e) {e.printStackTrace();}            byte[] buffer = new byte[512];            int bytesToRead = -1;            // 通过循环将读入的Word文件的内容输出到浏览器中            if(fin != null && out != null) {            try {    while((bytesToRead = fin.read(buffer)) != -1) {        out.write(buffer, 0, bytesToRead);    }    } catch (IOException e) {    e.printStackTrace();    }            }        } finally {            if(fin != null)try {fin.close();} catch (IOException e) {e.printStackTrace();}            if(out != null)try {out.close();} catch (IOException e) {e.printStackTrace();}            if(file != null) file.delete(); // 删除临时文件        }    }        /**     * 功能说明:    创建doc文件     * @param dataMap 数据     * @param template 模板     * @return     */    private static File createDoc(Map<?, ?> dataMap, Template template) {        String name =  "test.doc";        File f = new File(name);        Template t = template;        try {            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");            t.process(dataMap, w);            w.close();        } catch (Exception ex) {            ex.printStackTrace();        }        return f;    }