如何使用 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 任意大小的文件。
我了解如何使用 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 任意大小的文件。