导出携带图片的excel

	/**
	 * 导出携带图片的excel
	 * @param response
	 * @param records 数据list
	 * @param headers 导出的字段(key:字段  value:中文名称)
	 */
	private static void excelImages(HttpServletResponse response, List<ZoneDetailVo> records, Map<String, String> headers) {
		//records:导出的数据list,包含图片地址字段
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/octet-stream");
		if (records.isEmpty()) {
			throw new BizException("没有符合要求的商品");
		}
		ExcelWriter writer = cn.hutool.poi.excel.ExcelUtil.getWriter();
		writer.getCellStyle().setWrapText(true);
		writer.setHeaderAlias(headers).setOnlyAlias(true).write(records);

		// 写入图片
		Sheet sheet = writer.getSheet();
		Workbook workbook = sheet.getWorkbook();
		for (int i = 0; i < records.size(); i++) {
			writer.getCell(2, i+1).setCellValue("");
			writer.setColumnWidth(1, 15);
			writer.setColumnWidth(2, 15);
			writer.setColumnWidth(3, 15);
			writer.setColumnWidth(4, 15);
			writer.setColumnWidth(5, 15);
			writer.setRowHeight(i+1, 80);
			byte[] imgBytes;
			try {
				// 图片过大会吃光内存,图片进行压缩
				imgBytes = HttpUtil.downloadBytes(records.get(i).getImageUrl() + "?x-oss-process=image/resize,p_60");
			} catch (Exception ignored) {
				return;
			}
			//图片位置
			Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch();
			ClientAnchor anchor = drawingPatriarch.createAnchor(0, 0, 0, 0, 2, i+1, 3, i+2);
			anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
			drawingPatriarch.createPicture(anchor, workbook.addPicture(imgBytes, HSSFWorkbook.PICTURE_TYPE_PNG));
		}

		String fileName = DateUtil.format(new Date(), "yyyy-MM-dd") + ".xls";
		ServletOutputStream outputStream = null;
		try {
			outputStream = response.getOutputStream();
			response.setContentType("application/x-msdownload;charset=utf-8");
			String encodeFileName = URLEncoder.encode("销量表"+fileName, "UTF-8");
			response.setHeader("Content-Disposition", "attachment;filename=" + encodeFileName + ";" + "filename*=utf-8''" + encodeFileName);
		} catch (IOException e) {
			throw new RuntimeException(e);
		} finally {
			writer.flush(outputStream);
			writer.close();
		}
	}

导入包路径:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值