第一步:制作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; }