POI将Excel中的字符串读取为数字

3

我正在使用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)); 似乎是罪魁祸首... 请注释掉打印语句,然后再次检查。 - Sankumarsingh
1
我认为问题在于 cell.setCellType(Cell.CELL_TYPE_STRING); 这里是不应该存在的。当你删去 setCellType 这行代码后,DataFormatter 是否可以正确处理呢? - Gagravarr
已移除 setter。它运行良好。谢谢。 - yoda
2个回答

2
将评论提升为答案
问题在于调用。
cell.setCellType(Cell.CELL_TYPE_STRING);

这段代码的作用是要求POI将单元格从其当前格式(例如数字)转换为字符串。尝试进行此操作的转换相对简单,这就是为什么您会失去格式的原因。

如果您只想获取包含Excel中显示的单元格值的字符串,请直接调用DataFormatter,它会尽力而为。玩弄单元格类型只会让事情更加混乱,并且会冒失失去格式的风险。


0

在上面的回答中,需要补充的是,如果你正在使用dataformatter类来执行针对LIBRE OFFICE电子表格的程序,即使你使用poi,它也会输出1.0。因为poi在与excel不同的方式下无法与LIBRE SPREADSHEETS正常工作。


Apache POI 无法与 LibreOffice 电子表格配合使用,您需要使用 Apache ODF Toolkit 来处理由 OpenOffice 和 LibreOffice 生成的 ODF 电子表格。Apache POI 只能处理 .xls.xlsx Excel 文件格式。 - Gagravarr
那么,我们如何在POI中知道传入的xls或xlsx文件是在Excel或LibreOffice中创建的呢? - Anant Laxmikant Bobde
如果文件是 .xls.xlsx 格式,则它不是 LibreOffice 格式!LibreOffice 和 OpenOffice 使用 .ods(开放文档电子表格)格式作为其本地电子表格格式。 - Gagravarr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接