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

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

  • 使用模板生成Word
    • 新建模板
    • 代码
  • 组装压缩包

使用模板生成Word

链接: 参考poi api.

新建模板

模板语法
图片:使用easypoi导出带多图片Word压缩包_第1张图片

代码

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

最终效果如下
使用easypoi导出带多图片Word压缩包_第2张图片
如有不对请指正

你可能感兴趣的:(poi,导出word,多图片,压缩包)