Apache POI:将数字作为字符串获取,如excel中所示

时间:2014-09-24 13:22:52

标签: java excel apache-poi

我试图用POI解析excel工作簿。在工作表中,我将一些数字显示为:

06 85 85 65 45

(这是一个法国电话号码,它始终以0开头,每2位数字都有空格。)

我需要从excel Cell获取一个带零和空格的字符串。

以下是我调查的一些内容:

double doubleValue = cell.getNumericCellValue(); // worth 6.85856545E8
String dataStringFormat = cell.getCellStyle().getDataStringFormat(); // worth 0#" "##" "##" "##" "##

我想POI API有一种方法可以应用" dataStringFormat"到" doubleValue"得到像06 85 85 65 45这样的东西。

任何人都知道如何做到这一点?

非常感谢。

编辑: Gagravarr让我在路上。他的

DataFormatter fmt = new DataFormatter();
String phoneNumber = fmt.formatCellValue(cell);

仍然返回685856545但我感谢他,我找到了CellNumberFormatter类。并使用以下代码获取我的06 85 85 65 45:

String stringFormat = cell.getCellStyle().getDataFormatString();
CellNumberFormatter fmt = new CellNumberFormatter(stringFormat);
String phoneNumber = fmt.format(cell.getNumericCellValue()); // = 06 85 85 65 45

我尝试了其他格式的技巧,但仍存在一些问题。 - 123 3/25变成123 ?? / ?? (不支持分数格式?) - 1,23E + 09变为1,23.1,E + 09

有些因为语言环境: - 123 456 789成为123,456,789(数千和数百万的分隔符'用法语代替',') - 123,12变为123.45(再次','是法语中的小数分隔符,而不是'。') - €变成了? (在这里编码?)

时间和日期都有奇怪的行为: -12:12:12 PM变为[$ -4.69] 12:00:42 AM([$ -4.69]是excel stringFormat的一部分,POI似乎不支持) -12/11/14成为01/01/04(我不明白那个......)

我会尝试对此进行调查。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

Excel中的数字(除少数边缘情况外)存储为浮点数。 Java中的浮点数,当格式化为字符串时,打印有一个尾随小数点,如果大,则以科学(指数)格式打印,因为您正在查看

假设你真正想要的是"给我一个看起来就像Excel为这个单元显示的字符串",然后调用cell.toString(),而不是获取数字double值+ print作为字符串。这些不会给你你需要的东西。

相反,您需要使用DataFormatter class,它提供了读取应用于单元格的Excel格式规则的方法,然后重新创建(尽可能)Java中的那些

您的代码应为:

DataFormatter fmt = new DataFormatter();

String phoneNumber = fmt.formatCellValue(cell);

这将根据Excel中应用的格式规则格式化数字,因此应按预期返回

答案 1 :(得分:-1)

当您尝试将数字单元格作为String获取时,将出现错误。

在获取数字单元格之前,您应该将cellType设置为如下所示的字符串。

` HSSFCell yourCell = sheet1.getRow(row).getCell(column);
   yourCell.setCellType(Cell.CELL_TYPE_STRING);
   String data = yourCell.getStringCellValue();`