Hutool导出excel带前台Base64图片,hutool并没有封装具体方法,需要自己手动插入。
@Data
public class PicDto {
private String chartBase64Data;
}
public void excel(HttpServletResponse response, PicDto dto) {
ExcelWriter writer = ExcelUtil.getBigWriter();
String base64Data = dto.getChartBase64Data();
if (StrUtil.isNotBlank(base64Data)) {
String data = "";
String[] d = base64Data.split("base64,");
if (null != d && d.length == 2) {
data = d[1];
}
byte[] bytes = generateImage(data);
writePic(writer, 0, i + 3, bytes, HSSFWorkbook.PICTURE_TYPE_JPEG);
}
//全局样式设置
StyleSet styleSet = writer.getStyleSet();//获取整个Excel的样式
styleSet.setBackgroundColor(IndexedColors.WHITE, true);
styleSet.setBorder(BorderStyle.THIN, IndexedColors.BLACK1);
//设置全局文本居中
styleSet.setAlign(HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
String excelName = "excel.xls";
ServletOutputStream out = null;
try {
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("content-disposition", "attachment;filename=" + new String(excelName.getBytes("gb2312"), "ISO8859-1"));
out = response.getOutputStream();
} catch (Exception e) {
throw new Exception("导出失败");
} finally {
writer.flush(out, true);
// 关闭writer,释放内存
writer.close();
//此处记得关闭输出Servlet流
IoUtil.close(out);
}
}
//对字节数组字符串进行Base64解码并生成图片
public static byte[] GenerateImage(String base64str) {
try {
byte[] b = Base64.decode(base64str);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {//调整异常数据
b[i] += 256;
}
}
return b;
} catch (Exception e) {
log.error("Base64图片解码异常");
return null;
}
}
public void writePic(ExcelWriter writer, int x, int y, byte[] pictureData, int picType) {
Sheet sheet = writer.getSheet();
Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch();
//设置图片单元格位置
ClientAnchor anchor = drawingPatriarch.createAnchor(0, 0, 255, 255, x, y, x + 1, y + 1);
//随单元格改变位置和大小
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
//添加图片
int pictureIndex = sheet.getWorkbook().addPicture(pictureData, picType);
Picture picture = drawingPatriarch.createPicture(anchor, pictureIndex);
//按比例调整图像大小
picture.resize(0.5);
}