[英]how to read a large data of excel file (xlsx) using java
此編碼能夠讀取excel文件中的小數據...但無法讀取excel文件中的大數據文件...。如何進一步修改代碼?
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
*
* @author Administrator
*/
public class ReadExcelNdArray {
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
System.out.println("Time taken: " + (System.currentTimeMillis() - start) + " ms");
File myFile = new File("D://Raghulpr/Transaction Data.xlsx");
FileInputStream fis = new FileInputStream(myFile);
// Finds the workbook instance for XLSX file
XSSFWorkbook myWorkBook = new XSSFWorkbook (fis);
// Return first sheet from the XLSX workbook
XSSFSheet mySheet = myWorkBook.getSheetAt(0);
// Get iterator to all the rows in current sheet
Iterator<Row> rowIterator = mySheet.iterator();
// Traversing over each row of XLSX file
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
// For each row, iterate through each columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "\t");
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() + "\t");
break;
case Cell.CELL_TYPE_BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "\t");
break;
default :
}
}
System.out.println("");
}
}
}
線程“主”中的異常java.lang.OutOfMemoryError:Java堆空間
at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource$FakeZipEntry.<init>(ZipInputStreamZipEntrySource.java:121)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:55)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:88)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:272)
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:254)
at readexcelndarray.ReadExcelNdArray.main(ReadExcelNdArray.java:36)
首先,您需要在代碼中關閉所有FileInputStream
Input - output
流對象,例如FileInputStream
等。 其次,您還可以如本鏈接中所述增加 JVM堆空間: 增加Java中的堆大小
我不知道您是否仍然需要答案,但是我也在尋找相同的答案,並且正努力讀取大文件。 在Internet上花了很多時間之后,我找到了一個解決辦法。 您可以檢查Excel流式閱讀器
import com.monitorjbl.xlsx.StreamingReader;
InputStream is = new FileInputStream(new File("G:\\Book1.xlsx"));
Workbook workbook = StreamingReader.builder()
.rowCacheSize(100)
.bufferSize(4096)
.open(is);
現在,您可以使用工作簿來進一步處理文件。
我能夠處理具有超過4個lac記錄的xlsx文件。
您需要增加堆大小才能讀取大文件。我建議使用64位計算機。
我們有用於讀取,寫入excel文件的jxl api。 此api的問題在於,在起始行索引為0的情況下,最多可以讀取和寫入65535行。但這確實很靈活。
由於在您的情況下行數超過65535,因此建議您選擇Apache POI。 實際上,此api沒有限制。
我遇到了同樣的問題,如果您更改為低得多的SAX解析級別,則可以節省大量內存。 http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api
我認為我已將大約4.5 GB(!)的內存使用量(大約11MB的文件,帶有很多公式)減少到更易於管理的位置(記不清了,但是它太低了,不再重要了,至少減少了十分之一)。
難以實現,但如果需要減少內存占用,則值得花時間
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.