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

时间:2015-07-07 16:14:17

标签: java apache-poi xls event-driven poi-hssf

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

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

POIFS API几乎没有关于互联网或YouTube视频的详细解释,或者根本没有视频。虽然我非常了解“事件驱动”编程,但我很难理解这种方法。

我确实设法使用更新的方法在互联网上找到一段代码但是,我没有成功修改代码来做我想要的。

下面是代码,我想要它做的是从第一列中提取所有数据&从纸张18,19,20,21和2开始的第二行向前22.

任何帮助都会受到高度赞赏,或者至少有任何关于如何理解/学习这种新方法的指导。任何来源?

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

    }

}

1 个答案:

答案 0 :(得分:0)

谢谢你们的帮助。我很感激。

用户模型会对大型Excel文件引发OOM错误。但是,我刚刚了解了新的SS.usermodel,您可以使用它来处理旧版和旧版。同时使用较新的excel文件(XLS和XLSX),使用此用户模型,我还可以处理任何大小的excel文件。