使用XSS和Event读取Java中一个巨大的Excel文件的多个选项卡

我正在使用这个代码(由作者:lchen)从excel文件中读取内容,基于我提供给方法'readRow() '的行数。

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

但它只读取第一页的内容并丢弃其他后续页。 我的要求是读SHEET的名字; 并根据名字阅读SHEET的内容。 任何人都可以帮我定制这个代码提取SHEET名称和他们的内容? 请 ?

您需要使用的关键类,并调整您的使用,是XSSFReader 。 如果你看一下Javadocs ,你会发现它提供了所有工作表的InputStreams迭代器,以及获取根Workbookstream的方法。

如果你想访问所有的工作表,你需要改变这些行:

  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); .... } 

如果您也希望获取表单名称,则需要执行类似于基于Apache POI XLSX事件的文本提取器中显示的内容

 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); .... } } 

如果你想知道更多关于这个东西的知识,那么很容易阅读和遵循的一个最好的例子就是Apache POI附带的XSSFEventBasedExcelExtractor – 阅读代码并学习!