【问题标题】:Cannot get a numeric value from a text cell while getting data from xlsx file从 xlsx 文件获取数据时无法从文本单元格获取数值
【发布时间】:2020-01-30 12:56:36
【问题描述】:

.xlsx 文件中读取数据时出现以下错误。由于此错误,我无法读取数据。面对错误消息“无法从文本单元格获取数值”。

代码如下:

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)

【问题讨论】:

  • 请格式化问题以使代码可读
  • 我格式化了问题。请立即检查。
  • 似乎有日期的单元格不是日期类型的单元格。尝试在 Excel 文件中将单元格类型更改为日期。
  • 公式可以返回字符串作为结果,它们不仅仅是数字单元格!
  • 我可以使用 HSSFRichTextString 从公式中获取数值吗

标签: java apache-poi


【解决方案1】:

在您显示的代码中,rowArray 似乎是一个 String 数组。所以需要将所有单元格值作为String 表示。最好的方法是将DataFormatterFormulaEvaluator 结合使用:

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

使用这个整个切换单元格类型是没有必要的。 DataFormatter.formatCellValue:

将单元格的格式化值作为字符串返回,而不管 细胞类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多