猿问

POI API 的事件模型在 3.15 版本中是否不适用(出现编译错误)?

我已经实现了一个程序,我试图使用 SAX 和 XSSF(POI API) 以及 jar 版本 4.1 读取 excel 文件 (.xlsx),它工作正常。但它在 POI 版本 3.15 中给出了编译错误。

代码看起来像这样(在 4.10 中运行良好):

默认处理程序实现(SAXExcelSheetHandler.java):

import org.apache.poi.xssf.model.SharedStringsTable;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;


public class SAXExcelSheetHandler extends DefaultHandler {

    private SharedStringsTable sst;

    private String lastContents;

    private boolean nextIsString;


    public SAXExcelSheetHandler(SharedStringsTable sst) {

        this.sst = sst;

    }


    public void startElement(String uri, String localName, String name,

                             Attributes attributes) throws SAXException {

        // c => cell

        if(name.equals("c")) {

            // Print the cell reference

            System.out.print(attributes.getValue("r") + " - ");

            // Figure out if the value is an index in the SST

            String cellType = attributes.getValue("t");

            if(cellType != null && cellType.equals("s")) {

                nextIsString = true;

            } else {

                nextIsString = false;

            }

        }

        // Clear contents cache

        lastContents = "";

    }


    public void endElement(String uri, String localName, String name)

            throws SAXException {

        // Process the last contents as required.

        // Do now, as characters() may be called more than once

        if(nextIsString) {

            int idx = Integer.parseInt(lastContents);

            lastContents = sst.getItemAt(idx).getString();

            nextIsString = false;

        }


        // v => contents of a cell

        // Output after we've seen the string contents

        if(name.equals("v")) {

            System.out.println(lastContents);

        }

    }


    public void characters(char[] ch, int start, int length) {

        lastContents += new String(ch, start, length);

    }

}


幕布斯7119047
浏览 170回答 1
1回答

慕娘9325324

请不要坚持使用过时的软件版本。这样做不是我们在软件开发方面取得进步的方式。但当然,XSSF and SAX (Event API)版本也存在3.15。但在这个旧版本中SharedStringsTable已经没有办法了getItemAt。它只有getEntryAtwhich 返回 a org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst。所以类中的代码SAXExcelSheetHandler必须更改为:...import org.apache.poi.xssf.usermodel.XSSFRichTextString;......    public void endElement(String uri, String localName, String name)            throws SAXException {        // Process the last contents as required.        // Do now, as characters() may be called more than once        if(nextIsString) {            int idx = Integer.parseInt(lastContents);            //lastContents = sst.getItemAt(idx).getString();            lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();            nextIsString = false;        }        // v => contents of a cell        // Output after we've seen the string contents        if(name.equals("v")) {            System.out.println(lastContents);        }    }...也还没有一个SAXHelper. 所以类的代码POISaxXaafV2必须像这样改变:...import java.io.File;import java.io.InputStream;import java.util.Iterator;//import org.apache.poi.ooxml.util.SAXHelper;import org.apache.poi.openxml4j.opc.OPCPackage;import org.apache.poi.xssf.eventusermodel.XSSFReader;import org.apache.poi.xssf.model.SharedStringsTable;import org.xml.sax.ContentHandler;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import javax.xml.parsers.SAXParserFactory;import javax.xml.parsers.SAXParser;......        OPCPackage opcPackage = OPCPackage.open(file);        XSSFReader xssfReader = new XSSFReader(opcPackage);        SharedStringsTable sharedStringsTable = xssfReader.getSharedStringsTable();        //XMLReader xmlParser = SAXHelper.newXMLReader();        SAXParserFactory parserFactory = SAXParserFactory.newInstance();        SAXParser parser = parserFactory.newSAXParser();        XMLReader xmlParser = parser.getXMLReader();        ContentHandler contentHandler = new SAXExcelSheetHandler(sharedStringsTable);        xmlParser.setContentHandler(contentHandler);...
随时随地看视频慕课网APP

相关分类

Java
我要回答