Apache POI: Почему я получаю исключение нулевого указателя с Cell.getCellType () в операторе if, который не возникает, если ячейка пуста? - PullRequest
0 голосов
/ 07 июня 2019

Я создаю сценарий Groovy для экспорта таблиц из файла .xlsm в файл .csv, включая соответствующие формулы (а не сгенерированные данные).Когда скрипт вызывает .getCellType () в текущей ячейке, я получаю исключение нулевого указателя, даже если эта функция возникает в операторе if, который проверяет, является ли ячейка нулевой.

Я попытался заменить

if(cell != null) 

условие с

if(cell.getCellType() != CellType.BLANK)

безрезультатно.

Код и полное сообщение об ошибке ниже.

    #!/usr/bin/env groovy

    @Grab(group = 'org.apache.poi', module = 'poi', version = '4.1.0')
    @Grab(group = 'org.apache.poi', module = 'poi-ooxml', version = '4.1.0')

    import org.apache.poi.xssf.usermodel.XSSFWorkbook
    import org.apache.poi.xssf.usermodel.*
    import org.apache.poi.ss.usermodel.*


    Workbook wb = new XSSFWorkbook("input.xlsm")

    FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator()

    DataFormatter formatter = new DataFormatter()
    PrintStream out = new PrintStream(new FileOutputStream("output.csv"), true, "UTF-8")
    byte[] bom = [(byte)0xEF, (byte)0xBB, (byte)0xBF]
    out.write(bom)

    for (Sheet sheet : wb){
        for (Row row : sheet) {
            boolean firstCell = true
            for(Cell cell : row){
                if (! firstCell) out.print(',')
                if ( cell != null ) {
                    if (fe != null) cell = fe.evaluateInCell()
                    String value = formatter.formatCellValue(cell)
                    if (cell.getCellType() == CellType.FORMULA) {
                        value = "=" + value
                    }
                    out.print(value)
                }

                firstCell = false
            }
            out.println()
        }
    }

Сообщение об ошибке:

Caught: java.lang.NullPointerException: Cannot invoke method 
getCellType() on null object java.lang.NullPointerException: 
Cannot invoke method getCellType() on null object
at ExcelToCSV.run(ExcelToCSV.groovy:28)

Я ожидаю, что в случае, если текущая ячейка не равна нулю, если ячейка вычисляется как содержащая формулу, строка, выводимая в файл .csv, будет иметь "=", добавленный в началоиз этого, в противном случае он просто выведет строку, представляющую значение в ячейке.

У меня, к сожалению, есть проблемы с моей средой IDE, пропускающей точки останова, и в настоящее время я не могу пошагово просмотреть код или просмотреть значения переменных,это отдельная проблема, над которой я тоже работаю.До тех пор, пока я не решу это, я надеюсь, что кто-то сможет указать, чего мне не хватает.

1 Ответ

1 голос
/ 10 июня 2019

Вы присваиваете cell после нулевой проверки, но перед вызовом метода cell.Это присвоение должно быть нулевым значением.

evaluateInCell принимает аргумент типа Cell, поэтому, если вы замените строку

if (fe != null) cell = fe.evaluateInCell()
// cell == null

на

if (fe != null) cell = fe.evaluateInCell(cell)

тогда вы получите то, что, как говорят javadocs, вы должны получить, то есть неизменную ячейку для простых значений или результат формулы для формул.

Я думаю, вы также обнаружите, что тип ячейки изменится, чтобы отразить типзначение, возвращаемое оценкой формулы, поэтому ваш тест для CellType.FORMULA всегда будет ложным.

...