如何将Excel单元格中的数字字符串作为字符串(而非数字)读取?

joy*_*tor 137 java excel apache-poi

  1. 我有这样的内容的excel文件:

    • A1:SomeString

    • A2:2

    所有字段都设置为String格式.

  2. 当我使用POI在java中读取文件时,它告诉A2是数字单元格格式.

  3. 问题是A2中的值可以是2或2.0(我希望能够区分它们)所以我不能只使用它.toString().

如何将值读取为字符串?

小智 302

我有同样的问题.我cell.setCellType(Cell.CELL_TYPE_STRING);在读取字符串值之前做了,无论用户如何格式化单元格,都解决了问题.

  • 请注意[Apache POI javadocs明确表示不要这样做!](https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29)因为他们解释一下,你应该使用DataFormatter (53认同)
  • 使用DataFormatter.Javadoc警告我们使用上述方法. (6认同)
  • Gagravarr警告不要这样做是对的!从文档:"如果你想要做的是为你的数字单元格得到一个字符串值,停止!.这不是这样做的方法.而是,为了获取数字或布尔或日期单元格的字符串值,使用而不是DataFormatter." https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29我自己一直在使用这种技术,直到我不小心改变数据我不打算更改.(将类型设置为String,读取值,将类型设置回数字,再次读取并获取不同的数值!) (5认同)

Gag*_*arr 90

当你问这个问题时,我认为我们没有回到这个课程,但今天有一个简单的答案.

你想要做的是使用DataFormatter类.你传递了一个单元格,它会尽力返回一个字符串,其中包含Excel为该单元格显示的内容.如果你传递一个字符串单元格,你将得到回来的字符串.如果您传递了一个应用了格式规则的数字单元格,它将根据它们格式化数字并返回字符串.

对于您的情况,我假设数字单元格应用了整数格式规则.如果您要求DataFormatter格式化这些单元格,它将返回一个包含整数字符串的字符串.

另外,请注意许多人建议这样做cell.setCellType(Cell.CELL_TYPE_STRING),但Apache POI JavaDocs非常清楚地表明你不应该这样做!执行setCellType调用将失去格式,因为javadocs解释了转换为具有格式化剩余的String的唯一方法是使用DataFormatter类.

  • 只是一个小注意事项:请提供此类答案的简短代码片段,如果提供的链接中也有说明的话 (3认同)

Vin*_*ala 48

以下代码适用于任何类型的单元格.

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);
Iterator<Row> objIterator = 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);

}
Run Code Online (Sandbox Code Playgroud)

  • 工作得很好!我的建议是改变检索FormulaEvaluator的方式.Workbook类通过`getCreationHelper().createFormulaEvaluator()`方法提供了一个公式赋值器.这样您的代码就不会与HSSFFormulaEvaluator类耦合. (3认同)
  • 这应该是公认的答案。谢谢@Vinayak (2认同)
  • 不需要调用 objFormulaEvaluator.evaluate。这里没有使用它的返回值。 (2认同)

Sta*_*tov 29

在修改单元格类型时,我建议使用以下方法:

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}
Run Code Online (Sandbox Code Playgroud)

NumberToTextConverter可以使用Excel的规则正确地将double值转换为文本而不会丢失精度.


use*_*372 17

正如Poi的JavaDocs(https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29)中已经提到的那样,不要使用:

cell.setCellType(Cell.CELL_TYPE_STRING);
Run Code Online (Sandbox Code Playgroud)

但使用:

DataFormatter df = new DataFormatter();
String value = df.formatCellValue(cell);
Run Code Online (Sandbox Code Playgroud)

有关http://massapi.com/class/da/DataFormatter.html的更多示例


Raj*_*Mbm 9

是的,这很有效

推荐的:

        DataFormatter dataFormatter = new DataFormatter();
        String value = dataFormatter.formatCellValue(cell);
Run Code Online (Sandbox Code Playgroud)

旧:

cell.setCellType(Cell.CELL_TYPE_STRING);
Run Code Online (Sandbox Code Playgroud)

即使你有从cell公式中检索值的问题,仍然可行.

  • 但是你必须小心使用它来获得双倍值.对我来说它将值7.9变为7.8999956589965 ...... (5认同)
  • [Apache POI javadocs非常清楚你不应该这样做](https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int% 29):*如果您想要做的是获取数字单元格的字符串值,请停止!这不是这样做的方法.相反,要获取数字或布尔或日期单元格的字符串值,请改用DataFormatter.* (2认同)

iTa*_*ake 5

尝试:

new java.text.DecimalFormat("0").format( cell.getNumericCellValue() )
Run Code Online (Sandbox Code Playgroud)

应正确格式化数字。