如何使用 POIFS API 从 XLS 文件中的一张工作表中提取数据?

How to extract data from one of the sheets in XLS file using POIFS API?

我了解如何使用 POI API(用户模型)。但是,目前,这对我没有帮助,因为我正在处理大小超过 200 MB 的 XLS 文件。

在此处关于 堆栈溢出 的问题之一中,我了解到我需要使用 事件驱动方法 使用 POIFS API。

POIFS API 在互联网或 YouTube 视频上几乎没有任何详细的解释,或者根本没有视频。我一直在努力理解这种方法,尽管我对 'Event-Driven' 编程有很好的理解。

我确实设法使用较新的方法在互联网上的某个地方找到了一段代码,但是,我未能成功修改代码以执行我想要的操作。

下面是代码,我想要它做的是从工作表 18、19、20、21 和 22 的第一列和第二行开始提取所有数据。

他将高度赞赏任何帮助,或者至少是任何关于如何 understand/learn 这种新方法的指导。任何来源?

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
import org.apache.poi.hssf.eventusermodel.HSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFRequest;
import org.apache.poi.hssf.record.BOFRecord;
import org.apache.poi.hssf.record.BoundSheetRecord;
import org.apache.poi.hssf.record.LabelSSTRecord;
import org.apache.poi.hssf.record.NumberRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.RowRecord;
import org.apache.poi.hssf.record.SSTRecord;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class EventExample implements HSSFListener{

    private SSTRecord sstrec;

    @SuppressWarnings("static-access")
    public void processRecord(Record record) {


        switch (record.getSid()) {

        case BOFRecord.sid:

            BOFRecord bof = (BOFRecord) record;
            if (bof.getType() == bof.TYPE_WORKBOOK) {
                System.out.println("Encountered workbook");
            } else if (bof.getType() == bof.TYPE_WORKSHEET) {
                System.out.println("Encountered sheet reference");
            }
            break;

        case BoundSheetRecord.sid:

            BoundSheetRecord bsr = (BoundSheetRecord) record;
            System.out.println("New sheet named: " + bsr.getSheetname());
            break;

        case RowRecord.sid:

            RowRecord rowrec = (RowRecord) record;
            System.out.println("Row found, first column at " + rowrec.getFirstCol() + " last column at " + rowrec.getLastCol());
            break;

        case NumberRecord.sid:

            NumberRecord numrec = (NumberRecord) record;
            System.out.println("Cell found with value " + numrec.getValue() + " at row " + numrec.getRow() + " and column " + numrec.getColumn());
            break;

        case LabelSSTRecord.sid:

            LabelSSTRecord lrec = (LabelSSTRecord) record;
            System.out.println("String cell found with value " + sstrec.getString(lrec.getSSTIndex()));
            break;

        case SSTRecord.sid:

            sstrec = (SSTRecord) record;
            for (int k = 0; k < sstrec.getNumUniqueStrings(); k++) {
                System.out.println("String table value " + k + " = " + sstrec.getString(k));
            }
            break;

        } 


    }

    public static void main(String[] args) throws IOException {

        FileInputStream fin = new FileInputStream("C:\Users\bharat.nanwani\desktop\POI_Test.xls");
        POIFSFileSystem poifs = new POIFSFileSystem(fin);
        InputStream din = poifs.createDocumentInputStream("Workbook");
        HSSFRequest req = new HSSFRequest();
        req.addListenerForAllRecords(new EventExample());
        HSSFEventFactory factory = new HSSFEventFactory();
        factory.processEvents(req, din);
        fin.close();
        din.close();
        System.out.println("done.");

    }

}

谢谢大家的小小帮助。我很感激。

用户模型抛出大型 excel 文件的 OOM 错误。但是,我刚刚了解了新的 SS.usermodel,您可以使用它同时处理旧的和较新的 excel 文件(XLS 和 XLSX),并且有了这个用户模型,我还能够处理 excel 任意大小的文件。