Events POI事件API如何从Excel读取数据?为什么它使用更少的RAM?

Events POI事件API如何从Excel读取数据?为什么它使用更少的RAM?,events,apache-poi,Events,Apache Poi,我目前正在写我的学士论文,我正在使用Apache的POI事件API。简而言之,我的工作是关于从Excel中读取数据的更有效的方法 开发人员一次又一次地问我,事件API究竟意味着什么。不幸的是,我在Apache页面上找不到任何关于基本原理的内容 下面是我如何使用POI事件API的代码(来自XSSF和SAX的Apache示例): import java.io.InputStream; 导入java.util.Iterator; 导入org.apache.poi.ooxml.util.SAXHelpe

我目前正在写我的学士论文,我正在使用Apache的POI事件API。简而言之,我的工作是关于从Excel中读取数据的更有效的方法

开发人员一次又一次地问我,事件API究竟意味着什么。不幸的是,我在Apache页面上找不到任何关于基本原理的内容

下面是我如何使用POI事件API的代码(来自XSSF和SAX的Apache示例):

import java.io.InputStream;
导入java.util.Iterator;
导入org.apache.poi.ooxml.util.SAXHelper;
导入org.apache.poi.openxml4j.opc.OPCPackage;
导入org.apache.poi.xssf.eventusermodel.XSSFReader;
导入org.apache.poi.xssf.model.SharedStringsTable;
导入org.xml.sax.Attributes;
导入org.xml.sax.ContentHandler;
导入org.xml.sax.InputSource;
导入org.xml.sax.SAXException;
导入org.xml.sax.XMLReader;
导入org.xml.sax.helpers.DefaultHandler;
导入javax.xml.parsers.parserConfiguration异常;
公共类ExampleEventUserModel{
public void processOneSheet(字符串文件名)引发异常{
OPCPackage pkg=OPCPackage.open(文件名);
XSSFReader r=新XSSFReader(pkg);
SharedStringsTable sst=r.getSharedStringsTable();
XMLReader parser=fetchSheetParser(sst);
//要查找图纸名称/图纸顺序/rID,
//您需要处理核心工作簿流。
//通常它的形式是rId#或rSheet#
InputStream sheet2=r.getSheet(“rId2”);
InputSource sheetSource=新的InputSource(sheet2);
parser.parse(sheetSource);
表2.关闭();
}
public void processAllSheets(字符串文件名)引发异常{
OPCPackage pkg=OPCPackage.open(文件名);
XSSFReader r=新XSSFReader(pkg);
SharedStringsTable sst=r.getSharedStringsTable();
XMLReader parser=fetchSheetParser(sst);
迭代器sheets=r.getSheetsData();
while(sheets.hasNext()){
System.out.println(“处理新表:\n”);
InputStream sheet=sheets.next();
InputSource sheetSource=新的InputSource(表);
parser.parse(sheetSource);
sheet.close();
System.out.println(“”);
}
}
公共XMLReader fetchSheetParser(SharedStringsTable sst)引发SAXException、ParserConfiguration异常{
XMLReader parser=SAXHelper.newXMLReader();
ContentHandler=新的SheetHandler(sst);
setContentHandler(handler);
返回解析器;
}
/**
*请参阅org.xml.sax.helpers.DefaultHandler javadocs
*/
私有静态类SheetHandler扩展了DefaultHandler{
私人股本;
私有字符串内容;
私有布尔连接字符串;
专用SheetHandler(SharedStringsTable sst){
这个.sst=sst;
}
public void startElement(字符串uri、字符串localName、字符串name、,
属性)引发SAX异常{
//c=>单元
如果(名称等于(“c”)){
//打印单元格引用
System.out.print(attributes.getValue(“r”)+“-”;
//确定该值是否为SST中的索引
字符串cellType=attributes.getValue(“t”);
if(cellType!=null&&cellType.equals(“s”)){
nextIsString=true;
}否则{
nextiststring=false;
}
}
//清除内容缓存
lastContents=“”;
}
public void endElement(字符串uri、字符串localName、字符串名称)
抛出SAX异常{
//根据需要处理最后的内容。
//现在就做,因为characters()可能会被多次调用
if(nextIsString){
int idx=Integer.parseInt(lastContents);
lastContents=sst.getItemAt(idx.getString();
nextiststring=false;
}
//v=>单元格的内容
//看到字符串内容后输出
如果(名称等于(“v”)){
System.out.println(lastContents);
}
}
公共无效字符(字符[]ch,整数开始,整数长度){
lastContents+=新字符串(ch、开始、长度);
}
}
公共静态void main(字符串[]args)引发异常{
ExampleEventUserModel示例=新ExampleEventUserModel();
processOneSheet(args[0]);
示例.processAllSheets(args[0]);
}
}

有人能给我解释一下事件API是如何工作的吗?它是与基于事件的体系结构相同还是其他什么

A
*.xlsx
文件是存储在Office Open XML中的
Excel
,是
apache poi
作为
XSSF
处理的文件,它是一个
ZIP
存档,包含目录结构中
XML
文件中的数据。因此,我们可以解压缩
*.xlsx
文件,然后直接从
XML
文件中获取数据

/xl/sharedStrings.xml
包含所有字符串单元格值。还有描述工作簿结构的
/xl/workbook.xml
。还有存储工作表数据的
/xl/worksheets/sheet1.xml、/xl/worksheets/sheet2.xml、
。还有
/xl/styles.xml
具有表格中所有单元格的样式设置

默认情况下,在创建
xssfoolk
时,
*.xlsx
文件的所有这些部分都将成为对象表示形式,如
xssfoolk
XSSFSheet
XSSFRow
XSSFCell
。。。以及内存中
org.apache.poi.xssf.*.
的其他对象

了解
XSSFS的内存消耗情况
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.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.ParserConfigurationException;

public class ExampleEventUserModel {
    public void processOneSheet(String filename) throws Exception {
        OPCPackage pkg = OPCPackage.open(filename);
        XSSFReader r = new XSSFReader( pkg );
        SharedStringsTable sst = r.getSharedStringsTable();

        XMLReader parser = fetchSheetParser(sst);

        // To look up the Sheet Name / Sheet Order / rID,
        //  you need to process the core Workbook stream.
        // Normally it's of the form rId# or rSheet#
        InputStream sheet2 = r.getSheet("rId2");
        InputSource sheetSource = new InputSource(sheet2);
        parser.parse(sheetSource);
        sheet2.close();
    }

    public void processAllSheets(String filename) throws Exception {
        OPCPackage pkg = OPCPackage.open(filename);
        XSSFReader r = new XSSFReader( pkg );
        SharedStringsTable sst = r.getSharedStringsTable();

        XMLReader parser = fetchSheetParser(sst);

        Iterator<InputStream> sheets = r.getSheetsData();
        while(sheets.hasNext()) {
            System.out.println("Processing new sheet:\n");
            InputStream sheet = sheets.next();
            InputSource sheetSource = new InputSource(sheet);
            parser.parse(sheetSource);
            sheet.close();
            System.out.println("");
        }
    }

    public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException, ParserConfigurationException {
        XMLReader parser = SAXHelper.newXMLReader();
        ContentHandler handler = new SheetHandler(sst);
        parser.setContentHandler(handler);
        return parser;
    }

    /**
     * See org.xml.sax.helpers.DefaultHandler javadocs
     */
    private static class SheetHandler extends DefaultHandler {
        private SharedStringsTable sst;
        private String lastContents;
        private boolean nextIsString;

        private SheetHandler(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);
        }
    }

    public static void main(String[] args) throws Exception {
        ExampleEventUserModel example = new ExampleEventUserModel();
        example.processOneSheet(args[0]);
        example.processAllSheets(args[0]);
    }
}