Apache POI:从xlsx读取错误的数字/字符串值,而xls工作正常

时间:2014-06-04 09:29:48

标签: java excel apache apache-poi

我有两个excel表(一个.xls,一个.xlsx),单元格A1中的内容为“1234567891234.56”。

现在我试图将这些内容添加到我的java-app中,使用这样的Apache POI:

    private String getValue(Cell myCell, int myCelltype)
        throws CellAccessException {
    try {

        switch (myCelltype) {

        case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING:

            return myCell.getStringCellValue();

...

首先,CellType(myCell.getCellType())总是1(String),无论我如何格式化单元格本身。

其次,当我从xlsx阅读时,我从xls读取时得到“1234567891234.5601”,我得到了“1234567891234.56”,这是我期望的结果。

另一个例子是文件中的“12345678912345.6”和从xlsx读取的结果“12345678912345.602”。

我不知道,是什么导致了我的问题而其他人似乎没有类似的问题。

感谢您提供任何帮助。

先谢谢德国人的问候。 Ausric

编辑: 感谢您的评论和回答。遗憾的是,格式化返回值没有帮助,因为问题是从Excel工作表中获取正确的值。 在研究不变的CELL_TYPE时,我做了一个奇怪的观察: 当我从xls(!)文件中读取时,我得到了正确的值作为String(在本例中为1.23456789123456E + 20)。接下来,此String将转换为Double。

String content = myCell.getStringCellValue();
System.out.println(result + "#" +result.length());
Double dresult = Double.valueOf(result);
System.out.println(dresult);

输出如下:

1.23456789123456E + 20#20

1.2345678912345601E20

所以我首先想到的是,我从xlsx中的单元格中读取了这个错误,这些单元格是数字,但标记为单元格类型STRING,并将String转换为Double。 Double有什么问题吗?也许我们在这里得到了一些旧的Java版本而Double被打破了。我不认为这是poi的错,因为它是3.10 FINAL并且应该工作正常。或者是在转换此字符串时双重做某事我只是不明白?我是Java新手,也是这份工作......只是苦苦挣扎。

1 个答案:

答案 0 :(得分:0)

我不确定默认的十进制格式是否会在xls和xlsx中发生变化。然而,只是建议如果不修复小数位,你应该从你自己的目的修复它... ...

case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING:{
    DecimalFormat df = new DecimalFormat("##.##");
    return df.format(myCell.getNumericCellValue());