Events POI事件API如何从Excel读取数据?为什么它使用更少的RAM?
我目前正在写我的学士论文,我正在使用Apache的POI事件API。简而言之,我的工作是关于从Excel中读取数据的更有效的方法 开发人员一次又一次地问我,事件API究竟意味着什么。不幸的是,我在Apache页面上找不到任何关于基本原理的内容 下面是我如何使用POI事件API的代码(来自XSSF和SAX的Apache示例):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
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]);
}
}