1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 使用freemarker导出word并动态插入多张图片

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

时间:2021-04-12 03:06:28

相关推荐

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

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。