Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSS和事件读取Java中大型excel文件的多个选项卡_Java_Excel_Apache Poi - Fatal编程技术网

使用XSS和事件读取Java中大型excel文件的多个选项卡

使用XSS和事件读取Java中大型excel文件的多个选项卡,java,excel,apache-poi,Java,Excel,Apache Poi,我使用的代码来自(作者:lchen),它根据我提供给方法“readRow()”的行数从excel文件中读取内容 import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; i

我使用的代码来自(作者:lchen),它根据我提供给方法“readRow()”的行数从excel文件中读取内容

 import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.xml.sax.InputSource;


public class TestLargeFileRead {
    private int rowNum = 0;
    private OPCPackage opcPkg;
    private ReadOnlySharedStringsTable stringsTable;
    private XMLStreamReader xmlReader;


    public void XExcelFileReader(String excelPath) throws Exception {
        opcPkg = OPCPackage.open(excelPath, PackageAccess.READ);
        this.stringsTable = new ReadOnlySharedStringsTable(opcPkg);

        XSSFReader xssfReader = new XSSFReader(opcPkg);
        XMLInputFactory factory = XMLInputFactory.newInstance();
        InputStream inputStream = xssfReader.getSheetsData().next();
        xmlReader = factory.createXMLStreamReader(inputStream);


        while (xmlReader.hasNext()) {
            xmlReader.next();
            if (xmlReader.isStartElement()) {
                if (xmlReader.getLocalName().equals("sheetData"))
                    break;
            }
        }
    }


    public int rowNum() {
        return rowNum;
    }


    public List<String[]> readRows(int batchSize) throws XMLStreamException {
        String elementName = "row";
        List<String[]> dataRows = new ArrayList<String[]>();
        if (batchSize > 0) {
            while (xmlReader.hasNext()) {
                xmlReader.next();
                if (xmlReader.isStartElement()) {
                    if (xmlReader.getLocalName().equals(elementName)) {
                        rowNum++;
                        dataRows.add(getDataRow());
                        if (dataRows.size() == batchSize)
                            break;
                    }
                }
            }
        }
        return dataRows;
    }

    private String[] getDataRow() throws XMLStreamException {
        List<String> rowValues = new ArrayList<String>();
        while (xmlReader.hasNext()) {
            xmlReader.next();
            if (xmlReader.isStartElement()) {
                if (xmlReader.getLocalName().equals("c")) {
                    CellReference cellReference = new CellReference(
                            xmlReader.getAttributeValue(null, "r"));
                    // Fill in the possible blank cells!
                    while (rowValues.size() < cellReference.getCol()) {
                        rowValues.add("");
                    }
                    String cellType = xmlReader.getAttributeValue(null, "t");
                    rowValues.add(getCellValue(cellType));
                }
            } else if (xmlReader.isEndElement()
                    && xmlReader.getLocalName().equals("row")) {
                break;
            }
        }
        return rowValues.toArray(new String[rowValues.size()]);
    }

    private String getCellValue(String cellType) throws XMLStreamException {
        String value = ""; // by default
        while (xmlReader.hasNext()) {
            xmlReader.next();
            if (xmlReader.isStartElement()) {
                if (xmlReader.getLocalName().equals("v")) {
                    if (cellType != null && cellType.equals("s")) {
                        int idx = Integer.parseInt(xmlReader.getElementText());
                        return new XSSFRichTextString(
                                stringsTable.getEntryAt(idx)).toString();
                    } else {
                        return xmlReader.getElementText();
                    }
                }
            } else if (xmlReader.isEndElement()
                    && xmlReader.getLocalName().equals("c")) {
                break;
            }
        }
        return value;
    }

    @Override
    protected void finalize() throws Throwable {
        if (opcPkg != null)
            opcPkg.close();
        super.finalize();
    }
public static void main(String[] args)  {  
        try {  
            TestLargeFileRead howto = new TestLargeFileRead();  
            howto.XExcelFileReader("D:\\TEMP_CATALOG\\H1.xlsx");  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  


    }
}
import java.io.InputStream;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
导入javax.xml.stream.XMLInputFactory;
导入javax.xml.stream.XMLStreamException;
导入javax.xml.stream.XMLStreamReader;
导入org.apache.poi.openxml4j.opc.OPCPackage;
导入org.apache.poi.openxml4j.opc.PackageAccess;
导入org.apache.poi.ss.util.CellReference;
导入org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
导入org.apache.poi.xssf.eventusermodel.XSSFReader;
导入org.apache.poi.xssf.usermodel.XSSFRichTextString;
导入org.xml.sax.InputSource;
公共类TestLargeFileRead{
private int rowNum=0;
私人OPCPackage opcPkg;
私有只读共享stringsTable stringsTable;
私有XMLStreamReader;
公共void XExcelFileReader(字符串excelPath)引发异常{
opcPkg=OPCPackage.open(excelPath,PackageAccess.READ);
this.stringsTable=新的只读共享stringsTable(opcPkg);
XSSFReader XSSFReader=新的XSSFReader(opcPkg);
XMLInputFactory=XMLInputFactory.newInstance();
InputStream InputStream=xssfReader.getSheetsData().next();
xmlReader=factory.createXMLStreamReader(inputStream);
while(xmlReader.hasNext()){
xmlReader.next();
if(xmlReader.isStartElement()){
if(xmlReader.getLocalName().equals(“sheetData”))
打破
}
}
}
public int rowNum(){
返回rowNum;
}
公共列表readRows(int batchSize)引发XMLStreamException{
String elementName=“行”;
List dataRows=new ArrayList();
如果(批量大小>0){
while(xmlReader.hasNext()){
xmlReader.next();
if(xmlReader.isStartElement()){
if(xmlReader.getLocalName().equals(elementName)){
rowNum++;
add(getDataRow());
if(dataRows.size()==batchSize)
打破
}
}
}
}
返回数据行;
}
私有字符串[]getDataRow()引发XMLStreamException{
List rowValues=new ArrayList();
while(xmlReader.hasNext()){
xmlReader.next();
if(xmlReader.isStartElement()){
if(xmlReader.getLocalName().equals(“c”)){
CellReference CellReference=新的CellReference(
getAttributeValue(null,“r”);
//填写可能的空白单元格!
while(rowValues.size()

但它只读取第一页的内容,并丢弃其他后续页。我的要求是读表名;根据名字读那张纸的内容。有人能帮我自定义上述代码获取表名称及其内容吗?请?

您需要使用的关键类是。如果查看,您将看到它提供了所有工作表的输入流的迭代器,以及获取根工作簿流的方法

如果要访问所有图纸,需要更改以下行:

    InputStream inputStream = xssfReader.getSheetsData().next();
    xmlReader = factory.createXMLStreamReader(inputStream);
更像是:

Iterator<InputStream> sheetsData = xssfReader.getSheetsData();
while (sheetsData.hasNext()) {
    InputStream inputStream = sheetsData.next();
    xmlReader = factory.createXMLStreamReader(inputStream);

    ....
}

如果你想知道更多关于做这些事情的信息,那么最好的例子之一,很容易阅读和理解,就是ApachePOI附带的——阅读代码并学习

谢谢你-Gagravarr的回答!!我将按照您的建议工作,并将更新结果:)
XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
while (sheetsData.hasNext()) {
    InputStream inputStream = sheetsData.next();
    String sheetName = iter.getSheetName();

    if (sheetName.equalsIgnoreCase("TheSheetIWant")) {
       xmlReader = factory.createXMLStreamReader(inputStream);

       ....
    }
}