Есть ли какая-то конкретная причина, по которой POI создает числовую ячейку, когда на самом деле она пуста?Случается так, что к тому времени, когда я добираюсь до этой ячейки, я, очевидно, получаю ошибку времени выполнения, поскольку не могу получить строковое значение (в конце концов, это числовая ячейка) и также не могу получить числовое значение (не могуполучить число из пустой строки), поэтому мои 2 вопроса будут такими:
- Как появился POI?
- Есть ли способ справиться с этим сценарием без явного переходав мой файл 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("");
Заранее спасибо!