【问题标题】:POI reading excel strings as numericPOI将excel字符串读取为数字
【发布时间】:2013-12-06 18:20:30
【问题描述】:

我正在使用 Apache POI 来读取 excel 文件。在阅读它时,我注意到它将字符串作为浮点值。

如果我的单元格包含 1,那么它将获取为 1.0

我从之前的问题中得到了一些提示,并修改了代码,但浮点表示仍然保持原样。

如何正确读取字符串和日期的数据?

DataFormatter df = new DataFormatter();

        for (Row row : sheet) {

            for(int cn=0; cn<row.getLastCellNum(); cn++) {
                   // If the cell is missing from the file, generate a blank one
                   // (Works by specifying a MissingCellPolicy)
                   Cell cell = row.getCell(cn, Row.CREATE_NULL_AS_BLANK);
                   // Print the cell for debugging
                   cell.setCellType(Cell.CELL_TYPE_STRING);

                   System.out.println("CELL: " + cn + " --> " + df.formatCellValue(cell));

                   if (row.getRowNum() == 0) {

                        sheetColumnNames.add(cell.getRichStringCellValue().getString());
                    }

            }

        }

【问题讨论】:

  • 代码似乎正确...看来df.formatCellValue(cell));是罪魁祸首...请评论打印语句,然后再检查。
  • 我认为问题在于不应该存在的cell.setCellType(Cell.CELL_TYPE_STRING);。当您删除setCellType 行时,DataFormatter 是否正确?
  • 移除了二传手。它运作良好。谢谢

标签: java excel apache-poi


【解决方案1】:

提升对答案的评论

问题是调用

cell.setCellType(Cell.CELL_TYPE_STRING);

这样做是要求 POI 尝试将单元格从当前的任何内容(例如数字)转换为字符串。尝试执行此操作的转换非常简单,这就是您丢失格式的原因

如果您只想取回一个包含 Excel 中显示的单元格值的字符串,只需直接调用DataFormatter,它会尽力而为。使用 Cell Type 只会使事情变得混乱,并且会丢失格式

【讨论】:

    【解决方案2】:

    除了上述答案之外,如果您尝试针对 LIBRE OFFICE 电子表格执行程序,即使您使用 dataformatter 类,poi 也会为您提供 1.0 作为输出。因为 poi 在 LIBRE SPREADSHEETS 中的工作方式与在 excel 中的工作方式不同。

    【讨论】:

    • Apache POI 不适用于 LibreOffice 电子表格,使用需要使用 Apache ODF Toolkit 来处理 OpenOffice 和 LibreOffice 生成的 ODF 电子表格。 Apache POI 仅适用于 .xls.xlsx Excel 文件格式
    • 那我们怎么知道传入的 xls 或 xlsx 文件是在 excel 中创建的还是在 poi 中的 libre office 中创建的呢?
    • 如果文件是.xls.xlsx 格式,那么它不是LibreOffice 格式! LibreOffice 和 OpenOffice 使用 .ods(打开文档电子表格)格式作为它们的原生电子表格格式
    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多