[alibaba/easyexcel]跳跃读取sheet页出现npe,不确定是不是bug

2024-05-23 5 views
9

有3个sheet,我想读第2个,触发npe

   String fileName = "打码******圣光******圣光******马赛克";
        ArrayList<KGResource> resources = new ArrayList<>(1000);
        ExcelReader excelReader = EasyExcel.read(fileName, KGResource.class, new AnalysisEventListener<KGResource>() {
            @Override
            public void invoke(KGResource data, AnalysisContext context) {
                resources.add(data);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {

            }
        }).build();
        ReadSheet readSheet = EasyExcel.readSheet(1).headRowNumber(2).build();
        excelReader.read(readSheet);
        excelReader.finish();

回答

0

没有重现这个错误,测试代码:

    @Test
    public void testIssues1280() {
        ExcelWriter writer = EasyExcel.write(fileName).head(DemoData.class).build();
        List<DemoData> es = new ArrayList<>();
        DemoData e = new DemoData();
        e.setString("aaa");
        es.add(e);
        writer.write(es, EasyExcel.writerSheet(0).build());
        writer.write(es, EasyExcel.writerSheet(1).build());
        writer.write(es, EasyExcel.writerSheet(2).build());
        writer.finish();
        log.info("写入完成,开始读取");
        List<DemoData> resources = new ArrayList<>();
        ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new AnalysisEventListener<DemoData>() {
            @Override
            public void invoke(DemoData data, AnalysisContext context) {
                resources.add(data);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {

            }
        }).build();
        ReadSheet readSheet = EasyExcel.readSheet(1).build();
        excelReader.read(readSheet);
        excelReader.finish();
        log.info("size={}", resources.size());
        resources.stream().map(DemoData::getString).forEach(System.out::println);

    }
8

同样遇到这个问题,2.2.3版本会出现npe,切换成2.1.7后解决

问题代码如下:

import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener;

import java.util.LinkedHashMap;

public class DataListener extends AnalysisEventListener<LinkedHashMap<Integer, String>> { @Override public void invoke(LinkedHashMap<Integer, String> stringLinkedHashMap, AnalysisContext analysisContext) { System.out.println(stringLinkedHashMap); }

@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {

}

}

import com.alibaba.excel.EasyExcel;

public class JRunner { public static void main(String[] args) { EasyExcel.read("./tmp/alex/excel6m/e.xls", new DataListener()).sheet("Sheet1").doRead(); }

}

文件:

image

npe报错: Exception in thread "main" java.lang.NullPointerException at com.alibaba.excel.analysis.v03.handlers.BofRecordHandler.processRecord(BofRecordHandler.java:49) at com.alibaba.excel.analysis.v03.XlsSaxAnalyser.processRecord(XlsSaxAnalyser.java:158) at org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener.processRecord(MissingRecordAwareHSSFListener.java:203) at org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener.processRecord(FormatTrackingHSSFListener.java:92) at org.apache.poi.hssf.eventusermodel.HSSFRequest.processRecord(HSSFRequest.java:109) at org.apache.poi.hssf.eventusermodel.HSSFEventFactory.genericProcessEvents(HSSFEventFactory.java:179) at org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processEvents(HSSFEventFactory.java:136) at org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processWorkbookEvents(HSSFEventFactory.java:82) at org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processWorkbookEvents(HSSFEventFactory.java:54) at com.alibaba.excel.analysis.v03.XlsSaxAnalyser.execute(XlsSaxAnalyser.java:137) at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyserImpl.java:115) at com.alibaba.excel.ExcelReader.read(ExcelReader.java:182) at com.alibaba.excel.ExcelReader.read(ExcelReader.java:172) at com.alibaba.excel.read.builder.ExcelReaderSheetBuilder.doRead(ExcelReaderSheetBuilder.java:65)

是xls的文件出现的问题

2

试试这个测试用例

@Test public void t05Read03() { MultipleSheetsListener multipleSheetsListener = new MultipleSheetsListener(); ExcelReader excelReader = EasyExcel.read(file03, MultipleSheetsData.class, multipleSheetsListener).build(); List sheets = excelReader.excelExecutor().sheetList(); ReadSheet readSheet = sheets.get(2); excelReader.read(readSheet); excelReader.finish(); }

0

这个问题确实存在,例: ExcelReader excelReader = EasyExcelFactory.read(file.getInputStream()).build(); XxxRowDataListener materialBomRowDataListener = new XxxRowDataListener(); ReadSheet materialBomSheet = EasyExcelFactory .readSheet(2, "sheet2") .head(Xxx.class) .registerReadListener(new XxxRowDataListener(xxxService)) .build(); excelReader.read(materialBomSheet); 直接读index为2的sheet,出现npe的位置: BofRecordHandler:49行 - DefaultXlsReadContext.xlsReadSheetHolder()返回的是null

0

如果SheetUtils.match返回false,没有执行到“xlsReadContext.currentSheet(readSheet)”,为xlsReadContext.xlsReadSheetHolder()赋值

6

非常感谢您的意见,已经在最新版修复。