Java导入源码修改

文章讲述了作者在使用AutoPoi导入图片时遇到错误,通过逐步深入源码调试,复制相关类并修复`sheet.getDrawingPatriarch()`空指针问题,最终成功解决问题的过程。
摘要由CSDN通过智能技术生成

起因

在图片导入的时候使用了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的图片正常导入,其他方法也可以根据这种方法一步一步调用修改

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值