簡體   English   中英

我想從大於 10 mb 的多張工作表中讀取 Excel 文件中的數據

[英]I want to read data from excel file with multiple sheets which is greater than 10 mb

我的代碼適用於較小的 excel 文件但它不適用於大型 excel 文件,它會出現錯誤 OutOfMemory。

public void onReadClick (View view) {
    printlnToUser("reading XLSX file from resources");
    InputStream stream = getResources().openRawResource(R.raw.test3);
    try {
        XSSFWorkbook workbook = new XSSFWorkbook(stream);
        XSSFSheet sheet = workbook.getSheetAt(0);
        int rowsCount = sheet.getPhysicalNumberOfRows();
        FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
        for (int r = 0; r<10; r++) {
            Row row = sheet.getRow(r);
            int cellsCount = row.getPhysicalNumberOfCells();
            for (int c = 0; c<cellsCount; c++) {
                String value = getCellAsString(row, c, formulaEvaluator);
                String cellInfo = "r:"+r+"; c:"+c+"; v:"+value;
                printlnToUser(cellInfo);
            }
        }
    } catch (Exception e) {
        /* proper exception handling to be here */
        printlnToUser(e.toString());
    }
}

它導致以下運行時錯誤。 請盡快幫助。

看起來您的帖子主要是代碼; 請添加更多詳細信息。 這很煩人,刪除它。

2019-06-06 03:30:43.535 5224-5224/pro.kondratev.xlsxpoiexample E/AndroidRuntime: FATAL EXCEPTION: main
Process: pro.kondratev.xlsxpoiexample, PID: 5224
java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.view.View$DeclaredOnClickListener.onClick(View.java:4707)
    at android.view.View.performClick(View.java:5619)
    at android.view.View$PerformClick.run(View.java:22298)
    at android.os.Handler.handleCallback(Handler.java:754)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:165)
    at android.app.ActivityThread.main(ActivityThread.java:6375)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.view.View$DeclaredOnClickListener.onClick(View.java:4702)
    at android.view.View.performClick(View.java:5619) 
    at android.view.View$PerformClick.run(View.java:22298) 
    at android.os.Handler.handleCallback(Handler.java:754) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:165) 
    at android.app.ActivityThread.main(ActivityThread.java:6375) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802) 
 Caused by:java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available

您會收到內存不足錯誤,因為 POI 會在內存中讀取、解析和創建整個 Excel 文件的完整數據結構。 這可能會占用大量內存。 我看到您的程序從單個工作表中讀取。 這告訴我您可以將該工作表導出到 .csv(逗號分隔值)文件。 這樣就很容易讀取數據了。

我對您的業務流程了解不夠,無法查看可以在何處完成導出到 .csv 的操作,或者在您的流程中是否可以這樣做。 POI 因使用大量內存而臭名昭著。

另一種解決方案是直接從 Excel 文件中讀取。 .xlsx 文件實際上是一個 zip。 您可以打開它並從那里讀取數據。 您必須查看SpreadsheetML文檔以了解 .xslx zip 文件的格式,或者使用Open XML SDK ,它像 POI 一樣會使用內存,但可能不會那么多。

試一試 SXSSFWorkbook。 嘗試使用非常高效和高性能的流 SXSSFWorkbook 類,而不是 XSSFWorkbook(將整個 Excel 工作簿保存在內存中),如下所示:

SXSSFWorkbook workbook = new SXSSFWorkbook(100);

其中 100 是將保存在內存中並實時處理的默認行數,其他已處理的行將被刷新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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