【问题标题】:Read Excel Numeric cell values as they are in Java在 Java 中读取 Excel 数字单元格值
【发布时间】:2013-05-10 13:02:19
【问题描述】:

当我读取 excel 数字单元格值时,我得到的输出是小数。例如:79 读数为 79.0,0.00 读数为 0.0。我编写的应用程序代码是:

int type = cell.getCellType();
if (type == HSSFCell.CELL_TYPE_NUMERIC)
  System.out.println(cell.getNumericCellValue());

【问题讨论】:

    标签: java excel apache-poi


    【解决方案1】:

    这个问题在 Stack Overflow 上出现了很多,因此建议您查看许多类似的问题以找到答案!

    Excel 将文件格式中的几乎所有数字都存储为浮点值,这就是 POI 会为您返回一个数字单元格的双精度值的原因,因为那是真实存在的。如果您希望它看起来像在 Excel 中一样,您需要将针对单元格定义的格式规则应用于数字。因此,您想做完全相同的事情as in my answer here。引用:

    您想要做的是使用DataFormatter class。您将此单元格传递给它,它会尽力返回一个字符串,其中包含 Excel 会为您显示该单元格的内容。如果你给它传递一个字符串单元格,你会得到这个字符串。如果您向它传递一个应用了格式规则的数字单元格,它将根据它们格式化数字并返回字符串。

    对于您的情况,我假设数字单元格应用了整数格式规则。如果您要求 DataFormatter 格式化这些单元格,它会返回一个包含整数字符串的字符串。

    您需要做的就是:

    // Only need one of these
    DataFormatter fmt = new DataFormatter();
    
    // Once per cell
    String valueAsSeenInExcel = fmt.formatCellValue(cell);
    

    【讨论】:

    • 谢谢,我用DataFormatter得到了所需的解决方案。非常感谢!!
    • 请注意,如果您的单元格具有公式数据类型,则此解决方案将不起作用,将不会评估公式类型。
    • @userxuser 如果你有一个公式,你可以使用DataFormatter.formatCellValue(Cell,FormukaEvaluator) 在格式化之前对单元格进行评估
    • 您好,通过这种方法,只能将 excel 的一列转换为数字,但下一列无法正常显示。它仅作为双重价值出现。为什么?
    【解决方案2】:

    我不是 100% 这会起作用,但我相信您正在寻找的是 DecimalFormat

    【讨论】:

    • 是的,这个问题真的与 POI 无关......它是关于格式化 Java 双精度
    • 这个问题和POI有关,我是用org.apachi.poi来读取单元格值的。请帮我解决这个问题。
    • 我想读取 Excel 中的数字单元格值。但是我的代码是 79-->79.0, 100.50-->100.5。请纠正我做错的地方,我找不到。帮帮我!
    【解决方案3】:

    我假设您使用的是 Apache POI。

    您应该考虑使用DataFormats。 Here 是一些非常小的草稿代码。

    否则,如果您的工作簿中的数据一致,您可能需要将getNumericCellValue 返回的double 舍入为int

    System.out.println((int)Math.round(cell.getNumericCellValue()));
    

    【讨论】:

    • 单元格也有双值(例如:100.50)。尝试使用您建议的代码后,我得到的输出为 100,这是不需要的。如果值是 79、100.50,我应该像在 Excel 中那样读取它们。请帮帮我。
    • 我不想对来自 Excel 的任何数字单元格值进行四舍五入,我只想按原样阅读它们。但它的读数为 79-->79.0、100.50--> 100.5。请帮我解决这个问题。
    • 好的,所以你也有实际的双精度值,因此四舍五入将不起作用。您是否尝试过检查 Apache POI 的数据格式?我相信它会引导你走向正确的方向。这里有一些其他链接可以帮助您入门:poi.apache.org/apidocs/org/apache/poi/ss/usermodel/…poi.apache.org/apidocs/org/apache/poi/ss/usermodel/…
    【解决方案4】:

    如下使用DataFormatter,它会自动检测单元格的格式并产生字符串输出

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

    【讨论】:

      【解决方案5】:

      仍然有人面临这个问题可以使用这个 https://poi.apache.org/apidocs/dev/org/apache/poi/ss/util/NumberToTextConverter.html

      NumberToTextConverter.toText(cell.getNumberiCellValue())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多