使用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;
    }

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值