apache-poi - 如何使用 Apache XSSF POI 流 API 读取实数值而不是格式化值?
问题描述
我使用流式 POI API 并希望读取单元格的实际值而不是格式化的单元格。下面的代码可以正常工作,但是如果用户没有在我的代码读取的 excel 表中显示一个值的所有数字,那么我的结果中就会得到相同的截断值。我在流式 API 中没有找到任何解决方案——在我的情况下,这是解决我在没有流式的情况下使用 POI API 时遇到的内存问题所需要的。
/**
* @see org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.SheetContentsHandler cell(java.lang.String,
* java.lang.String)
*/
@Override
void cell(String cellReference, String formattedValue, XSSFComment comment) {
useTheCellValue(formattedValue)
}
解决方案
如果您正在构建XSSFSheetXMLHandler,您可以提供一个DataFormatter。因此,如果您正在创建自己的DataFormatter
,这DataFormatter
可以让您完全访问格式问题。
通过更改svnpublic void processSheet
中的 XLSX2CSV 示例的外观示例:
...
public void processSheet(
StylesTable styles,
ReadOnlySharedStringsTable strings,
SheetContentsHandler sheetHandler,
InputStream sheetInputStream) throws IOException, SAXException {
//DataFormatter formatter = new DataFormatter();
DataFormatter formatter = new DataFormatter(java.util.Locale.US) {
//do never formatting double values but do formatting dates
public java.lang.String formatRawCellContents(double value, int formatIndex, java.lang.String formatString) {
if (org.apache.poi.ss.usermodel.DateUtil.isADateFormat(formatIndex, formatString)) {
return super.formatRawCellContents(value, formatIndex, formatString);
} else {
//return java.lang.String.valueOf(value);
return super.formatRawCellContents(value, 0, "General");
}
}
};
InputSource sheetSource = new InputSource(sheetInputStream);
try {
XMLReader sheetParser = SAXHelper.newXMLReader();
ContentHandler handler = new XSSFSheetXMLHandler(
styles, null, strings, sheetHandler, formatter, false);
sheetParser.setContentHandler(handler);
sheetParser.parse(sheetSource);
} catch(ParserConfigurationException e) {
throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage());
}
}
...
推荐阅读
- google-bigquery - Bigquery:根据亲属表查找家族
- c - MPI 通信是否被视为程序并行部分的一部分
- oracle - EBCDIC 数据加载到 oracle
- c++ - 使用递归将整数值数组以相反的顺序输出到屏幕
- swift - 在 Swift 中解析多部分 SOAP 响应
- javascript - 异步/等待语法:有没有办法定义一个代码块在函数之后执行而不阻塞执行?
- entity-framework - ValidationMessageFor 未显示某些字段?MVC 英孚
- python - 重启后无法建立连接
- excel - 需要可能的 IF 语句 Excel 公式
- android - 在创建扩展 RealmObject 的领域类时 Glide 错误“找不到符号类 GlideApp”