【问题标题】:Apache POI Java 6 to 8 DifferenceApache POI Java 6 到 8 的区别
【发布时间】:2017-09-20 14:03:01
【问题描述】:

我在 apache poi 3.12 和 Java 1.6 中使用 HSSFWorkbook 将 .xls 文件转换为制表符分隔的文本文件。在我的 processRecord 方法中,我使用 NumberRecord numrec 上的 FormatTrackingHSSFListener 从数字字段中获取值,代码如下:

String value = formatListener.getFormatString(numrec);

这需要一个值,例如 21.9,然后将其四舍五入为最接近的整数。我的问题是,当我更改为运行 Java 1.8 的新服务器时,该值被截断而不是四舍五入,因此 21.9 变为 21 而不是 22。我浏览了 apache 的 poi 文档,他们没有提到更改行为,所以我要求回答以下问题:

  • 为什么会发生这种情况? (最不重要)
  • 在 Java 1.8 中,有没有办法检索该值以便舍入而不是截断?
  • 有没有办法以原始形式检索值而不进行舍入或截断?

我已经尝试过另一种从 xls 文件中获取值的方法:

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

但我得到了相同的行为。

【问题讨论】:

  • 如果您尝试最新版本的 Apache POI(目前为 3.17)会发生什么?
  • 可能您已经检查过了,但您能确认 java 版本之间的 numrec 值始终相同吗?你可以为它写一个单元测试用例。
  • 更新到最新的 poi (3.17) 完成了这项工作,谢谢大家

标签: java excel apache apache-poi xls


【解决方案1】:

我没有 java 8 ,但是使用 java 7 和以下 apache poi 库我没有问题(我认为问题是 apache poi 版本)。

public static void main(String[] args) {

    try {
        FileInputStream is = new FileInputStream(new File("C:\\ook.xls"));
        HSSFWorkbook wb = new HSSFWorkbook(is);
        HSSFSheet sheet = wb.getSheet("Sheet1");

        Row row =  sheet.getRow(0);
        Cell cell = row.getCell(0);

        System.out.println(cell.getNumericCellValue());//returns a double value so its ok

    } catch (IOException e) {
        e.printStackTrace();
    }
    finally{

    }
}

Apache poi 库:

结果:

Excel 文件:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多