首页 > 解决方案 > 如何使用 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) 
    }

标签: apache-poisxssf

解决方案


如果您正在构建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());
     }
}
...

推荐阅读