代码之家  ›  专栏  ›  技术社区  ›  Black

POI DataFormatter默认向下取整5,而不是向上取整

  •  0
  • Black  · 技术社区  · 5 年前

    在ApachePOI中,我试图读取单元格(原始)值为0.575的Excel电子表格

    据我所知 DataFormatter.formatCellValue() 方法是以Excel文档中显示的方式返回单元格值。

    Excel中的单元格格式是自定义的: "£"#,##0.00;[Red]-"£"#,##0.00

    它在Excel中的显示方式为:0.58

    当我使用:

    DataFormatter formatter = new DataFormatter();
    String displayValue = formatter.formatCellValue(cell);
    

    我得到:0.57英镑

    为什么POI的格式化程序会将值舍入,而Excel会将其舍入?

    我试过:

    if( type == CellType.NUMERIC ) {
        Format format = formatter.getDefaultFormat(cell);
        if( format instanceof DecimalFormat ) {
            DataFormatter.setExcelStyleRoundingMode((DecimalFormat)format);
        }
    }
    

    但是舍入模式没有设置,因为 format 是 ExcelGeneralNumberFormat .委员会成员之一 总体安排 是一个DecimalFormat(我可以从调试器中看到),但似乎我没有API访问它。

    我认为这是相关的:当我检查单元格的XML值时,我看到:

    <xml-fragment r="D1" s="2">
      <main:v>0.57499999999999996</main:v>
    </xml-fragment>
    

    这当然不同于我在Excel中看到的“原始”值(0.575)。 如果POI框架四舍五入为0.5749999999996而不是0.575,那么这当然可以解释为什么它是向下四舍五入而不是向上四舍五入。 复制Excel行为的唯一方法是将原始值四舍五入到3dp(0.575),然后四舍五入 再一次 至2dp(0.58)

    0 回复  |  直到 5 年前
    推荐文章