Как обрабатывать пустую числовую ячейку в POI - PullRequest
0 голосов
/ 28 мая 2018

Есть ли какая-то конкретная причина, по которой POI создает числовую ячейку, когда на самом деле она пуста?Случается так, что к тому времени, когда я добираюсь до этой ячейки, я, очевидно, получаю ошибку времени выполнения, поскольку не могу получить строковое значение (в конце концов, это числовая ячейка) и также не могу получить числовое значение (не могуполучить число из пустой строки), поэтому мои 2 вопроса будут такими:

  1. Как появился POI?
  2. Есть ли способ справиться с этим сценарием без явного переходав мой файл Excel?

ОБНОВЛЕНИЕ I: После чтения / анализа моего файла Excel, POI генерирует следующий XML для этой конкретной ячейки:

  <x:c r="AA2" t="n">
      <x:v/>
  </x:c>

Мой метод похож на этот:

    final FileInputStream inputStream = new FileInputStream(new File("PATH/TO/FILE.xml"));
    final XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
    final XSSFSheet sheet = workbook.getSheet("SHEET_NAME");

    final int columnCount = sheet.getRow(0).getLastCellNum();
    for (int rowNumber = 0; rowNumber <= sheet.getLastRowNum(); rowNumber++)
    {
        final XSSFRow row = sheet.getRow(rowNumber);
        for (int column = 0; column < columnCount; column++)
        {
            // By now my cell would throw an exception if I attempt cell.getStringCellValue() or cell.getNumericCellValue() as cell.getCellType() returns "0" / NUMERIC
            final XSSFCell cell = row.getCell(column);
            ...
        }
    }

Я думал о добавлении дополнительной проверки, чтобы определить, является ли ячейка пустой, с помощью метода getRawValue (), но не уверен, есть ли лучший способ справиться с этим, поскольку он был явно ошибочно проанализирован.

ОБНОВЛЕНИЕ II Я смог воспроизвести этот сценарий, добавив его как часть модульного теста (я до сих пор не понимаю, почему POI попадет в этот сценарий).гх):

    final XLSXSheetConverterImpl xlsxSheetConverter = new XLSXSheetConverterImpl();
    xlsxSheetConverter.setSheetName(SHEET_NAME);
    xlsxSheetConverter.setFilePrefix(FILE_PREFIX);

    XSSFWorkbook workbook = new XSSFWorkbook();
    final XSSFSheet sheet = workbook.createSheet(SHEET_NAME);

    final XSSFRow row = sheet.createRow(0);
    XSSFCell cell = row.createCell(0);
    final CTCellImpl ctCell = (CTCellImpl) cell.getCTCell();
    ctCell.setT(STCellType.N);
    ctCell.setV("");

Заранее спасибо!

1 Ответ

0 голосов
/ 28 мая 2018

Это известная ошибка в более старых версиях POI, см .: https://bz.apache.org/bugzilla/show_bug.cgi?id=56702

Исправлено с версии 3.11

Спасибо всем за помощь !!

...