我了解如何使用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.");
}
}
答案 0 :(得分:0)
谢谢你们的帮助。我很感激。
用户模型会对大型Excel文件引发OOM错误。但是,我刚刚了解了新的SS.usermodel,您可以使用它来处理旧版和旧版。同时使用较新的excel文件(XLS和XLSX),使用此用户模型,我还可以处理任何大小的excel文件。