Невозможно получить значение цифры c из текстовой ячейки при получении данных из файла xlsx - PullRequest
1 голос
/ 28 января 2020

Ошибка ниже при чтении данных из файла .xlsx. Я не могу прочитать данные из-за этой ошибки. При появлении сообщения об ошибке «невозможно получить числовое значение c из текстовой ячейки».

Вот код:

switch (cell.getCellType()) {
    case HSSFCell.CELL_TYPE_FORMULA:
        rowArray[count] = isCellDateFormatted(cell) ? dateFormat.format(cell.getDateCellValue()) : Double.toString(cell.getNumericCellValue());
        break;
    case Cell.CELL_TYPE_BOOLEAN:
        rowArray[count] = Boolean.toString(cell.getBooleanCellValue());
        break;
    case Cell.CELL_TYPE_NUMERIC:
        rowArray[count] = isCellDateFormatted(cell) ? dateFormat.format(cell.getDateCellValue()) : Double.toString(cell.getNumericCellValue());
        break;
    case Cell.CELL_TYPE_STRING:
        rowArray[count] = cell.getStringCellValue().replace(separatorStr, escapeStr + separatorStr).replace("\n", " ");
        break;
    default:
        rowArray[count] = "";
}

Вот исключение:

java.lang.IllegalStateException: Cannot get a numeric value from a text cell
 at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:994)
 at org.apache.poi.xssf.usermodel.XSSFCell.getNumericCellValue(XSSFCell.java:305)
 at org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(DateUtil.java:494)
 at cvx.qwer.adfffg.excel.XlsxToCsv.convertToCsv(XlsxToCsv.java:76)
 at cvx.qwer.adfffg.excel.XlsxToCsv.main(XlsxToCsv.java:136)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

1 Ответ

0 голосов
/ 30 января 2020

На ваш показанный код rowArray выглядит как массив String. Поэтому необходимо получить все значения ячеек в виде String представлений. Лучший способ сделать это - использовать DataFormatter в сочетании с FormulaEvaluator :

...
Workbook workbook ...
...
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
DataFormatter formatter = new DataFormatter();
...
Cell cell ...
...
rowArray[count] = formatter.formatCellValue(cell, evaluator);
...

. При этом переключение типов ячеек не требуется. DataFormatter.formatCellValue :

Возвращает форматированное значение ячейки в виде строки независимо от типа ячейки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...