为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯7119047 2023-06-08 19:11:51
我已经实现了一个程序,我试图使用 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);    }}
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

请不要坚持使用过时的软件版本。这样做不是我们在软件开发方面取得进步的方式。


但当然,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);

...


查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信