我试图用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(我不明白那个......)
我会尝试对此进行调查。
感谢您的帮助。
答案 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();`