我使用流式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)
}
答案 0 :(得分:2)
如果您正在构建XSSFSheetXMLHandler,则可以提供DataFormatter。因此,如果您要创建自己的DataFormatter
,则DataFormatter
可以让您完全访问格式问题。
通过更改the XLSX2CSV example in svn的public void processSheet
:
...
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());
}
}
...
答案 1 :(得分:0)
我已经在POI上看到关于这一点的票证:https://bz.apache.org/bugzilla/show_bug.cgi?id=61858
它通过改变现有的类提供了第一个解决方案。
这可能是一个有趣的解决方法,即使理想的解决方案应该是使用标准解决方案。