我有同样的问题.我cell.setCellType(Cell.CELL_TYPE_STRING);
在读取字符串值之前做了,无论用户如何格式化单元格,都解决了问题.
我有同样的问题.我cell.setCellType(Cell.CELL_TYPE_STRING);
在读取字符串值之前做了,无论用户如何格式化单元格,都解决了问题.
当你问这个问题时,我认为我们没有回到这个课程,但今天有一个简单的答案.
你想要做的是使用DataFormatter类.你传递了一个单元格,它会尽力返回一个字符串,其中包含Excel为该单元格显示的内容.如果你传递一个字符串单元格,你将得到回来的字符串.如果您传递了一个应用了格式规则的数字单元格,它将根据它们格式化数字并返回字符串.
对于您的情况,我假设数字单元格应用了整数格式规则.如果您要求DataFormatter格式化这些单元格,它将返回一个包含整数字符串的字符串.
另外,请注意许多人建议这样做cell.setCellType(Cell.CELL_TYPE_STRING)
,但Apache POI JavaDocs非常清楚地表明你不应该这样做!执行setCellType
调用将失去格式,因为javadocs解释了转换为具有格式化剩余的String的唯一方法是使用DataFormatter类.
以下代码适用于任何类型的单元格.
InputStream inp =getClass().getResourceAsStream("filename.xls")); Workbook wb = WorkbookFactory.create(inp); DataFormatter objDefaultFormat = new DataFormatter(); FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb); Sheet sheet= wb.getSheetAt(0); IteratorobjIterator = sheet.rowIterator(); while(objIterator.hasNext()){ Row row = objIterator.next(); Cell cellValue = row.getCell(0); objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator); }
在修改单元格类型时,我建议使用以下方法:
if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { String str = NumberToTextConverter.toText(cell.getNumericCellValue()) }
NumberToTextConverter可以使用Excel的规则正确地将double值转换为文本而不会丢失精度.
正如Poi的JavaDocs(https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29)中已经提到的那样,不要使用:
cell.setCellType(Cell.CELL_TYPE_STRING);
但使用:
DataFormatter df = new DataFormatter(); String value = df.formatCellValue(cell);
有关http://massapi.com/class/da/DataFormatter.html的更多示例
是的,这很有效
推荐的:
DataFormatter dataFormatter = new DataFormatter(); String value = dataFormatter.formatCellValue(cell);
旧:
cell.setCellType(Cell.CELL_TYPE_STRING);
即使你有从cell
公式中检索值的问题,仍然可行.