使用HSSF从Excel读取字符串值,但它是双精度的

2022-09-03 09:46:27

我正在使用HSSF-POI来读取excel数据。问题是我在一个单元格中有一个看起来像数字的值,但实际上是字符串。如果我看一下Excel中的格式单元格,它说类型是“文本”。HSSF Cell仍然认为它是数字。如何将值作为字符串获取?

如果我尝试使用,我得到例外;如果 ,则与 Excel 工作表中的值不同。cell.getRichStringValuecell.toString

编辑:在这个问题得到解决之前,我会使用

new BigDecimal(cell.getNumericCellValue()).toString()

答案 1

您在POI中寻找的类是DataFormatter

当 Excel 写入文件时,某些单元格存储为文本字符串,而其他单元格存储为数字。对于后者,表示单元格的浮点值存储在文件中,因此当您向POI询问单元格的值时,它实际上具有的值。

有时,特别是在执行文本提取时(但并非总是如此),您希望使单元格值看起来像在Excel中一样。并不总是能够在字符串中完全获得它(例如,非全空间填充),但DataFormatter类将使您接近。

如果你正在追逐一个单元格的字符串,看起来和你在Excel中看起来一样,只需做:

 // Create a formatter, do this once
 DataFormatter formatter = new DataFormatter(Locale.US);

 .....

 for(Cell cell : row) {
     CellReference ref = new CellReference(cell);
     // eg "The value of B12 is 12.4%"
     System.out.println("The value of " + ref.formatAsString() + " is " + formatter.formatCellValue(cell));
 }

格式化程序将按原样返回 String 单元格,对于“数字”,单元格将对样式的格式设置规则应用于单元格的编号


答案 2

如果要分析的文档始终位于特定布局中,则可以动态将单元格类型更改为“string”,然后检索该值。例如,如果列 2 应始终为字符串数据,请将其单元格类型设置为 string,然后使用字符串类型的 get 方法读取它。

cell.setCellType(Cell.CELL_TYPE_STRING);

在我的测试中,更改单元格类型不会修改单元格的内容,但允许使用以下任一方法检索它:

cell.getStringCellValue();

cell.getRichStringCellValue().getString();

如果没有未正确转换的值的示例,则很难知道这的行为是否与您在描述中描述的 cell.toString() 方法有任何不同。


推荐