如何使用Apache XSSF POI流API读取实际数值而不是格式化值?

时间:2018-05-29 09:10:02

标签: apache-poi sxssf

我使用流式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) 
    }

2 个答案:

答案 0 :(得分:2)

如果您正在构建XSSFSheetXMLHandler,则可以提供DataFormatter。因此,如果您要创建自己的DataFormatter,则DataFormatter可以让您完全访问格式问题。

通过更改the XLSX2CSV example in svnpublic 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

它通过改变现有的类提供了第一个解决方案。

这可能是一个有趣的解决方法,即使理想的解决方案应该是使用标准解决方案。