使用Apache POI XSSF API时将所有单元格视为字符串

时间:2017-02-15 16:33:17

标签: apache-poi

我正在使用Apache POI框架来解析大型Excel电子表格。我正在使用此示例代码作为指南:XLSX2CSV.java

我发现只包含数字的单元格被隐含地视为数字字段,而我希望它们始终被视为字符串。所以,不是获取1.00E+13(我目前正在获取),而是获得原始字符串值:10020300000000

示例代码使用XSSFSheetXMLHandler传递DataFormatter的实例。有没有办法使用DataFormatter将所有单元格视为字符串?

或者作为替代方案:在接口SheetContentsHandler.cell方法的实现中,有一个字符串值,即cellReference。有没有办法将cellReference转换为索引,以便我可以使用SharedStringsTable.getEntryAt(int idx)方法直接从字符串表中读取?

要重现此问题,只需在您选择的xlsx文件上运行示例代码,其编号与上例中的编号类似。

更新:事实证明,我得到的字符串值似乎与您在Excel中看到的相匹配。所以我猜这通常会“足够好”。我希望我发送的数据“看起来正确”,因此它将被正确解析。但是,我确信会有错误,在这种情况下,如果我能使用流API获取原始字符串值,那就太好了。

1 个答案:

答案 0 :(得分:0)

要解决此问题,我根据XSSFSheetXMLHandler

创建了自己的类

我复制了该类,重命名了它,然后在endElement方法中我更改了原始字符串格式化代码的这部分:

           case NUMBER:
               String n = value.toString();
               if (this.formatString != null && n.length() > 0)
                   thisStr = formatter.formatRawCellContents(Double.parseDouble(n), this.formatIndex, this.formatString);
               else
                   thisStr = n;
               break;

我更改了它,以便它不会格式化原始字符串:

        case NUMBER:
            thisStr = value.toString();
            break;

现在,我的电子表格中的每个数字都返回了原始值,而不是格式化版本。

相关问题