当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将Excel单元格中的数字字符串作为字符串(而非数字)读取?》经验,为你挑选了6个好方法。

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



1> 小智..:

我有同样的问题.我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
使用DataFormatter.Javadoc警告我们使用上述方法.
Gagravarr警告不要这样做是对的!从文档:"如果你想要做的是为你的数字单元格得到一个字符串值,停止!.这不是这样做的方法.而是,为了获取数字或布尔或日期单元格的字符串值,使用而不是DataFormatter." https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29我自己一直在使用这种技术,直到我不小心改变数据我不打算更改.(将类型设置为String,读取值,将类型设置回数字,再次读取并获取不同的数值!)

2> Gagravarr..:

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

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

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

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



3> Vinayak Dorn..:

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

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 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);

}


工作得很好!我的建议是改变检索FormulaEvaluator的方式.Workbook类通过`getCreationHelper().createFormulaEvaluator()`方法提供了一个公式赋值器.这样您的代码就不会与HSSFFormulaEvaluator类耦合.

4> Stanislav Ma..:

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

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}

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



5> userM1433372..:

正如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的更多示例



6> Rajesh Mbm..:

是的,这很有效

推荐的:

        DataFormatter dataFormatter = new DataFormatter();
        String value = dataFormatter.formatCellValue(cell);

旧:

cell.setCellType(Cell.CELL_TYPE_STRING);

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


但是你必须小心使用它来获得双倍值.对我来说它将值7.9变为7.8999956589965 ......
[Apache POI javadocs非常清楚你不应该这样做](https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int% 29):*如果您想要做的是获取数字单元格的字符串值,请停止!这不是这样做的方法.相反,要获取数字或布尔或日期单元格的字符串值,请改用DataFormatter.*
推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有