我正在使用Apache POI框架来解析大型Excel电子表格。我正在使用此示例代码作为指南:XLSX2CSV.java
我发现只包含数字的单元格被隐含地视为数字字段,而我希望它们始终被视为字符串。所以,不是获取1.00E+13
(我目前正在获取),而是获得原始字符串值:10020300000000
。
示例代码使用XSSFSheetXMLHandler
传递DataFormatter
的实例。有没有办法使用DataFormatter将所有单元格视为字符串?
或者作为替代方案:在接口SheetContentsHandler.cell
方法的实现中,有一个字符串值,即cellReference。有没有办法将cellReference转换为索引,以便我可以使用SharedStringsTable.getEntryAt(int idx)
方法直接从字符串表中读取?
要重现此问题,只需在您选择的xlsx文件上运行示例代码,其编号与上例中的编号类似。
更新:事实证明,我得到的字符串值似乎与您在Excel中看到的相匹配。所以我猜这通常会“足够好”。我希望我发送的数据“看起来正确”,因此它将被正确解析。但是,我确信会有错误,在这种情况下,如果我能使用流API获取原始字符串值,那就太好了。
答案 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;
现在,我的电子表格中的每个数字都返回了原始值,而不是格式化版本。