簡體   English   中英

如何使用Java讀取Excel文件(xlsx)的大數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM