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