簡體   English   中英

Apache Poi RowIterator 僅返回最后 100 (0 - 99) 行

[英]Apache Poi RowIterator only returning the last 100 (0 - 99) rows

我有代碼,其中工作簿由一個進程創建,然后由另一個進程讀取,而無需將工作簿寫入文件(第二個進程實際上將文件寫入 csv 文件)。

閱讀本書時,只閱讀最后 100 行。 我需要做什么才能讓迭代器返回所有行? 示例代碼如下所示,完整的示例在這里:

https://github.com/NACHC-CAD/poi-example-01

代碼:

package org.nachc.examples.poi.iteratorexample;

import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.junit.Test;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class IteratorExampleIntegrationTest {

    public static final int MAX = 220;
    
    @Test
    public void shouldWriteCells() throws Exception {
        SXSSFWorkbook book = new SXSSFWorkbook();
        Sheet sheet = book.createSheet("sheet-001");
        // create the book
        log.info("* * * CREATING * * *");
        for(int r=0;r<MAX;r++) {
            Row row = sheet.createRow(r);
            for(int c=0;c<5;c++) {
                Cell cell = row.createCell(c);
                String str = "ROW " + r + " COL " + c;
                log.info("CREATING: " + str);
                cell.setCellValue(str);
            }
        }
        log.info("* * * ECHO * * *");
        Iterator<Row> rowIterator = sheet.rowIterator();
        while(rowIterator.hasNext()) {
            Row row = rowIterator.next();
            log.info("Got Row: " + row.getRowNum());
        }
        book.close();
        log.info("Done.");
    }

}

輸出(為簡潔起見在“...”處截斷)

19:55:59.366 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - * * * CREATING * * *
19:55:59.378 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - CREATING: ROW 0 COL 0
19:55:59.379 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - CREATING: ROW 0 COL 1
19:55:59.380 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - CREATING: ROW 0 COL 2
19:55:59.380 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - CREATING: ROW 0 COL 3
19:55:59.380 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - CREATING: ROW 0 COL 4
...
...
19:55:59.448 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - CREATING: ROW 219 COL 1
19:55:59.448 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - CREATING: ROW 219 COL 2
19:55:59.448 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - CREATING: ROW 219 COL 3
19:55:59.448 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - CREATING: ROW 219 COL 4
19:55:59.448 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - * * * ECHO * * *
19:55:59.448 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - Got Row: 120
19:55:59.448 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - Got Row: 121
19:55:59.448 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - Got Row: 122
19:55:59.448 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - Got Row: 123
...
...
19:55:59.452 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - Got Row: 217
19:55:59.452 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - Got Row: 218
19:55:59.452 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - Got Row: 219
19:55:59.595 [main] INFO org.nachc.examples.poi.iteratorexample.IteratorExampleIntegrationTest - Done.

- - 編輯 - - - - - - - - -

為清楚起見:這里的解決方案不是從流行迭代器中取回所有行,而是實現一個流過程,該過程可以與流行迭代器的使用內聯(請參閱已接受答案中的評論)。

我需要做什么才能讓迭代器返回所有行?

不要使用SXSSFWorkbook ,因為這是流式版本,它在將最后 100 行(可配置)刷新到磁盤之前僅將它們保留在內存中,因此是流式部分。

所以說文檔

POI-HSSF 和 POI-XSSF/SXSSF - 訪問 Microsoft Excel 格式文件的 Java API

由於實現的流式特性,與 XSSF 相比有以下限制:

  • 在某個時間點只能訪問有限數量的行

SXSSFWorkbook Javadoc

實現“BigGridDemo”策略的XSSFWorkbook流媒體版本。 這允許寫入非常大的文件而不會耗盡內存,因為在任何時候都只有行的可配置部分保留在內存中。


SXSSF(流用戶模型 API)

SXSSF(包: org.apache.poi.xssf.streaming )是 XSSF 的 API 兼容流擴展,可在必須生成非常大的電子表格且堆空間有限時使用。 SXSSF 通過限制對滑動窗口內的行的訪問來實現其低內存占用,而 XSSF 允許訪問文檔中的所有行。 不再出現在窗口中的舊行將無法訪問,因為它們被寫入磁盤。

您可以在工作簿構建時通過new SXSSFWorkbook(int windowSize)指定窗口大小,也可以通過SXSSFSheet#setRandomAccessWindowSize(int windowSize)設置它

當通過createRow()創建新行並且未刷新的記錄總數將超過指定的窗口大小時,具有最低索引值的行將被刷新並且無法再通過getRow()訪問

默認窗口大小為 100 ,由SXSSFWorkbook.DEFAULT_WINDOW_SIZE定義。

暫無
暫無

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

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