java - 从 xlsx 文件获取数据时无法从文本单元格获取数值
问题描述
.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)
解决方案
在您显示的代码中,这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:
无论单元格类型如何,都将单元格的格式化值作为字符串返回。
推荐阅读
- python-3.x - 如何对已经分组的栏进行分组?
- windows - 我正在尝试查看此脚本的结果,当它运行时它会立即关闭并且不显示用户添加的组
- apache-kafka - 如何处理过期的生产者批次
- python - Sphinx 文档,自动模块的“缩短路径”
- javascript - 将字符串传递给 new Date() 构造函数会导致日期无效
- linux - 如何使用 Curl 将日志文件保存到 Mongodb 服务器
- java - 根据客户端 URL 启用 Spring Security 身份验证
- webp - 即使在实施不同的图像格式之后,Google PSI 也会发出“以下一代格式提供图像”警告
- r - 使用托管在闪亮服务器中的多个应用程序访问相同的数据
- python - 整个数据库是浮动的,它会导致报告问题