/**
* 导出携带图片的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();
}
}
导入包路径: