起因
在图片导入的时候使用了AutoPoi的导入工具类,然后在发现在没导入图片前没报错,在放入了图片后直接报错,还无法修改
解决方案
后面回头一想,既然可以通过Ctrl+左键能进去看到源码,为什么不将源码复制出来,通过自己重新创建一个ExcelUtil去找到报错的原因呢,以以下代码为例:
//1、ExcelImportUtil是依赖自带的工具类,且无法修改
List<SaleImportDTO> list = ExcelImportUtil.importExcel(file.getInputStream(), SaleImportDTO.class, params);
//2、进去后在ExcelImportUtil中会有一个importExcel的方法
//从这一层开始都是依赖自带的源码了,但是我们无法修改
public static <T> List<T> importExcel(InputStream inputstream, Class<?> pojoClass, ImportParams params) throws Exception {
return new ExcelImportServer().importExcelByIs(inputstream, pojoClass, params).getList();
}
//3、将ExcelImportUtil的类复制出来,我们新建一个ExcelUtil的类,将内容复制进去,且代码调用我们自己的ExcelUtil.importExcel方法
//4、显而易见ExcelUtil.importExcel继续报错,importExcel方法又调用了ExcelImportServer的一个类
//我们将ExcelImportServer类也复制出来创建一个新的类,并修改ExcelUtil的方法
public ExcelImportResult importExcelByIs(InputStream inputstream, Class<?> pojoClass, ImportParams params) throws Exception {
//省略。。。。。。。。。。。。。
for (int i = 0; i < params.getSheetNum(); i++) {
}
if (isXSSFWorkbook) {
pictures = PoiPublicUtil.getSheetPictrues07((XSSFSheet) book.getSheetAt(i), (XSSFWorkbook) book);
} else {
pictures = PoiPublicUtil.getSheetPictrues03((HSSFSheet) book.getSheetAt(i), (HSSFWorkbook) book);
}
//省略。。。。。。。。。
if (params.isNeedSave()) {
saveThisExcel(params, pojoClass, isXSSFWorkbook, book);
}
return new ExcelImportResult(result, verfiyFail, book);
}
//5、跟着方法继续debug,发现PoiPublicUtil.getSheetPictrues03报错了
//那我们继续复制PoiPublicUtil的类,创建新类(方法的单词还拼错了Pictrues。。。)
public static Map<String, PictureData> getSheetPictrues03(HSSFSheet sheet, HSSFWorkbook workbook) {
Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
List<HSSFPictureData> pictures = workbook.getAllPictures();
if (!pictures.isEmpty()) {
for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) {
HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
if (shape instanceof HSSFPicture) {
HSSFPicture pic = (HSSFPicture) shape;
int pictureIndex = pic.getPictureIndex() - 1;
HSSFPictureData picData = pictures.get(pictureIndex);
String picIndex = String.valueOf(anchor.getRow1()) + "_" + String.valueOf(anchor.getCol1());
sheetIndexPicMap.put(picIndex, picData);
}
}
return sheetIndexPicMap;
} else {
return null;
}
}
//6、直到第三层debug发现在sheet.getDrawingPatriarch()中空指针的问题,因此修改
public static Map<String, PictureData> getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) {
Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
List<HSSFPictureData> pictures = workbook.getAllPictures();
if (!pictures.isEmpty()) {
HSSFPatriarch drawingPatriarch = sheet.getDrawingPatriarch();
if (drawingPatriarch == null) {
return sheetIndexPicMap;
}
for (HSSFShape shape : drawingPatriarch.getChildren()) {
HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
if (shape instanceof HSSFPicture) {
HSSFPicture pic = (HSSFPicture) shape;
int pictureIndex = pic.getPictureIndex() - 1;
HSSFPictureData picData = pictures.get(pictureIndex);
String picIndex = anchor.getRow1() + "_" + String.valueOf(anchor.getCol1());
sheetIndexPicMap.put(picIndex, picData);
}
}
return sheetIndexPicMap;
} else {
return null;
}
}
至此,修改完成,重新启动项目,导入excel的图片正常导入,其他方法也可以根据这种方法一步一步调用修改