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

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

要在使用 EasyPoi 导出 Excel 文件时插入图片,您需要使用 `ExcelExportUtil` 类和 `ImageExportUtil` 类。 以下是一个示例代码: ```java public class ExportWithImageTest { public static void main(String[] args) throws IOException { // 准备数据 List<User> userList = new ArrayList<>(); userList.add(new User("John", 25, getImageBytes("john.png"))); userList.add(new User("Jane", 30, getImageBytes("jane.png"))); // 导出 Excel 文件 Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), User.class, userList); // 插入图片 for (int i = 0; i < userList.size(); i++) { byte[] imageBytes = userList.get(i).getImageBytes(); if (imageBytes != null) { ImageExportUtil.createImage(workbook, (byte[]) imageBytes, i, 2, 3, 5); } } // 保存文件 FileOutputStream outputStream = new FileOutputStream("users.xlsx"); workbook.write(outputStream); outputStream.close(); } private static byte[] getImageBytes(String filename) throws IOException { InputStream inputStream = ExportWithImageTest.class.getResourceAsStream(filename); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } return outputStream.toByteArray(); } } ``` 在上面的代码中,我们首先创建了一个包含用户姓名、年龄和头像图片字节数组的列表。然后,我们使用 `ExcelExportUtil` 导出 Excel 文件,并遍历用户列表以插入图片。 请注意,我们需要将图片插入到正确的单元格中,以便它们与相应的用户匹配。在上面的示例中,我们将图片插入到第二列的第四行和第三列的第四行。 另外,我们还需要使用 `ImageExportUtil` 类的 `createImage` 方法将图片插入到工作簿中。该方法接受一个工作簿对象、一个字节数组、一个行索引、一个列索引和四个单元格偏移量,以确定图片应该插入到哪个单元格中。 最后,我们将工作簿保存到文件中。在上面的示例中,我们将文件保存为 `users.xlsx`。 请注意,如上所述,该示例仅适用于在单元格中插入静态图片的情况。如果您需要在单元格中插入动态图像或其他更高级的功能,可能需要使用其他库或更复杂的技术实现。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值