Apache POI 抛出 NPE

问题描述 投票:0回答:1

尝试读取相当大的 Excel 文件,因此使用

SheetContentsHandler

这是我的主要代码:

OPCPackage pkg = OPCPackage.open(file);
            XSSFReader reader = new XSSFReader(pkg);

            InputStream sheet = reader.getSheet("rId1");
            XMLReader parser = XMLHelper.newXMLReader();
            CustomXSSFSheetHandler sheetHandler = new CustomXSSFSheetHandler();
            parser.setContentHandler(new XSSFSheetXMLHandler(null, null, sheetHandler, false));

            InputSource sheetSource = new InputSource(sheet);
            parser.parse(sheetSource);

            recordList = sheetHandler.getRecords();

            sheet.close();

这是我的实现

SheetContentsHandler

public class CustomXSSFSheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler
{
    private int currentRow = -1;
    private final List<Record> recordList = new ArrayList<>();
    private Record currentRecord = null;

    @Override
    public void startRow(int rowNum)
    {
        if (rowNum > 0)
        {
            currentRow = rowNum;
            currentRecord = new Record();
        }
    }

    @Override
    public void endRow(int rowNum)
    {
        if (currentRow > 0)
        {
            recordList.add(currentRecord);
        }
    }

    @Override
    public void cell(String cellReference, String formattedValue, XSSFComment comment)
    {
        if (currentRow > 0)
        {
            int currentCol = getColIndex(cellReference);

            if (currentCol == 0)
            {
                currentRecord.setSerialNo(Long.parseLong(formattedValue));
            } else if (currentCol == 1)
            {
                currentRecord.setReferenceNo(Long.parseLong(formattedValue));
            } else if (currentCol == 2)
            {
                currentRecord.setMsn(Long.parseLong(formattedValue));
            } else if (currentCol == 3)
            {
                currentRecord.setI1(Double.parseDouble(formattedValue));
            } else if (currentCol == 4)
            {
                currentRecord.setI2(Double.parseDouble(formattedValue));
            } else if (currentCol == 5)
            {
                currentRecord.setI3(Double.parseDouble(formattedValue));
            } else if (currentCol == 6)
            {
                currentRecord.setV1(Double.parseDouble(formattedValue));
            } else if (currentCol == 7)
            {
                currentRecord.setV2(Double.parseDouble(formattedValue));
            } else if (currentCol == 8)
            {
                currentRecord.setV3(Double.parseDouble(formattedValue));
            }
        }
    }

    private int getColIndex(String cellReference)
    {
        // Extract the column index from the cell reference (e.g., "A1")
        String colStr = cellReference.replaceAll("[0-9]", "");
        int colIndex = 0;
        for (int i = 0; i < colStr.length(); i++)
        {
            colIndex = colIndex * 26 + (colStr.charAt(i) - 'A' + 1);
        }
        return colIndex - 1;
    }

    public List<Record> getRecords()
    {
        return recordList;
    }
}

解析开始后,我收到此错误:

java.lang.NullPointerException: Attempt to invoke interface method 'org.apache.poi.ss.usermodel.RichTextString org.apache.poi.xssf.model.SharedStrings.getItemAt(int)' on a null object reference
at org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.outputCell(XSSFSheetXMLHandler.java:419)
at org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.endElement(XSSFSheetXMLHandler.java:317)
at org.apache.harmony.xml.ExpatParser.endElement(ExpatParser.java:167)
at org.apache.harmony.xml.ExpatParser.appendBytes(Native Method)

我的Excel文件:

android apache-poi xssf
1个回答
0
投票

本声明:

parser.setContentHandler(new XSSFSheetXMLHandler(null, null, sheetHandler, false));

缺少第二个参数,它是一个

SharedStringsTable
对象并且是必需的。通过使用修复它:

parser.setContentHandler(new XSSFSheetXMLHandler(null, new ReadOnlySharedStringsTable(pkg), sheetHandler, false));
© www.soinside.com 2019 - 2024. All rights reserved.