使用easypoi导出带多图片Word压缩包

使用easypoi导出多图片多Word压缩包

使用模板生成Word

链接: 参考poi api.

新建模板

模板语法
图片:poi会自动根据大括号中的key绑定对应的值

代码

public XWPFDocument imageWordExport(byte[] imgdata,byte[] backImgData) {
        Map<String, Object> map = new HashMap<String, Object>();
        //身份证正面图
        WordImageEntity image = new WordImageEntity();
        image.setHeight(300);
        image.setWidth(500);
        image.setData(imgdata);
        image.setType(WordImageEntity.Data);
        map.put("img", image);
        //身份证反面图
        WordImageEntity backImg = new WordImageEntity();
        backImg.setHeight(300);
        backImg.setWidth(500);
        backImg.setData(backImgData);
        backImg.setType(WordImageEntity.Data);
        map.put("backImg", backImg);
        try {
            XWPFDocument doc = WordExportUtil.exportWord07("export/template/IDcardImg.docx", map);
            return doc;
        } catch (Exception e) {
            e.printStackTrace();
        }
		return null;
    }

这里我使用的是根据byte[],也可以根据路径,例如

  backImg.setUrl(url);
  backImg.setType(WordImageEntity.URL);

组装压缩包

	String codedFileName = "班组成员身份证图片.zip";
	//设置响应头
	if ((request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 
	|| request.getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0) ? true : false) {
				codedFileName = java.net.URLEncoder.encode(codedFileName, "UTF8");
	} else {
		codedFileName = new String(codedFileName.getBytes("UTF-8"), "ISO-8859-1");
	}
	response.setHeader("content-disposition", "attachment;filename=" + codedFileName);

	ServletOutputStream responseOutputStream=response.getOutputStream();
	ZipOutputStream zipOutputStream = new ZipOutputStream(responseOutputStream);
	OutputStream outputStream = new BufferedOutputStream(zipOutputStream);
			
	int i =0;
	for (Map<String, Object> map : findWorkerMasterList) {
			//将网络图片转为byte[]数组
			ByteArrayOutputStream imgdata = WordUtils.putImageToOutputStream(String.valueOf(map.get("idcard_numberimg")), request);
			ByteArrayOutputStream backImgData = WordUtils.putImageToOutputStream(String.valueOf(map.get("idcard_number_backimg")), request);
			//生成Word对象
			XWPFDocument word = imageWordExport(imgdata.toByteArray(), backImgData.toByteArray());
			if (word!= null) {
				//压缩包内的文件名不能重复,所以加个数字
				zipOutputStream.putNextEntry(new ZipEntry("身份证图片"+i+".docx"));
				ByteArrayOutputStream bos=new ByteArrayOutputStream();
				word.write(bos);
				byte[] content=bos.toByteArray();
				//将Word转为字节数组写入response输出流中
				outputStream.write(content);
				i++;
			}
		}
		outputStream.close();
		zipOutputStream.close();
		responseOutputStream.flush();

记得关闭流

	 /** 
      * 将网络图片写入到OutputStream中
      * imgfile 网络图片路径
      */  
 	public static java.io.ByteArrayOutputStream putImageToOutputStream(String imgFile) {  
 		InputStream input = null;
 		java.io.ByteArrayOutputStream swapStream = new java.io.ByteArrayOutputStream(); 
 		try { 
 			if (imgFile.contains("http")) {
 				URL url = new URL(imgFile);  
 				URLConnection con = url.openConnection();
 				con.setConnectTimeout(5*1000);
 				input = con.getInputStream();
 				byte[] b = new byte[1024];
 				int n;
 				while ((n = input.read(b)) != -1) {
 					swapStream.write(b, 0, n);
 				}
 				input.close();
			}
 		}
 		catch (FileNotFoundException ex1) {
 			ex1.printStackTrace();
 		}
 		catch (IOException ex1) {
 			ex1.printStackTrace();
 		}
 		return swapStream;
 	}

最终效果如下
最终效果如下
如有不对请指正

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值