1.将图片放在resoure目录下
2.读取图片并插入excel
private void monthContractRow1(Sheet sheet, CellStyle style1, String language, Workbook workbook) {
Row row1 = sheet.createRow(0);
// 行高
row1.setHeight((short) 450);
Cell cellB1 = row1.createCell(0);
try {
Drawing<?> patriarch = sheet.createDrawingPatriarch();
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
// 读取图片
File file = ResourceUtils.getFile("classpath:file/dongben-logo.png");
// 获取路径
String url = file.getAbsolutePath();
BufferedImage bufferImg = ImageIO.read(new File(url));
ImageIO.write(bufferImg, "png", byteArrayOut);
// 设置图片位置
ClientAnchor anchor3 = new XSSFClientAnchor(0, 0, 255, 50, (short) 0, 0, (short) 1, 1);
anchor3.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
patriarch.createPicture(anchor3, workbook.addPicture(byteArrayOut.toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG));
} catch (IOException e) {
log.error(e.getMessage());
}
cellB1.setCellStyle(style1);
// 合并首行单元格 // 起始行, 终止行, 起始列, 终止列
CellRangeAddress cra = new CellRangeAddress(0, 0, 0, 4);
sheet.addMergedRegion(cra);
}
3.最终效果图
4.方法改进(本地正常,线上不行)
上述方法在本地环境读取图片正常,但是在线上无法实现,
这是因为打包后Spring试图访问文件系统路径,但无法访问JAR中的路径。
因此必须使用resource.getInputStream()
改进代码如下:
private void monthContractRow1(Sheet sheet, CellStyle style1, String language, Workbook workbook) {
Row row1 = sheet.createRow(0);
// 行高
row1.setHeight((short) 500);
Cell cellB1 = row1.createCell(0);
try {
Drawing<?> patriarch = sheet.createDrawingPatriarch();
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
// 读取图片
// File file = ResourceUtils.getFile("classpath:file/dongben-logo.png");
// // 获取路径
// String url = file.getAbsolutePath();
// BufferedImage bufferImg = ImageIO.read(new File(url));
// 通过file读取图片在本地环境测试没问题,但是线上无法读取图片,故通过流来读取图片
ClassPathResource resource = new ClassPathResource("file/dongben-logo.png");
InputStream inputStream = resource.getInputStream();
BufferedImage bufferImg = ImageIO.read(inputStream);
ImageIO.write(bufferImg, "png", byteArrayOut);
// 设置图片位置
ClientAnchor anchor3 = new XSSFClientAnchor(0, 0, 255, 50, (short) 0, 0, (short) 1, 1);
anchor3.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
patriarch.createPicture(anchor3, workbook.addPicture(byteArrayOut.toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG));
} catch (IOException e) {
log.error("-----------插入图片失败--------:{}",e.getMessage());
}
cellB1.setCellStyle(style1);
// 合并首行单元格 // 起始行, 终止行, 起始列, 终止列
CellRangeAddress cra = new CellRangeAddress(0, 0, 0, 4);
sheet.addMergedRegion(cra);
}