POI到量大的數據到EXCEL

根據官網ex: apache

SXSSF(包:org.apache.poi.xssf.streaming)是一種API-compatible流擴展XSSF時使用 很是大的電子表格製做,和堆空間是有限的。 SXSSF達到低內存佔用經過限制訪問的行 在一個滑動窗口,而XSSF給訪問的全部行嗎 文檔。 老行再也不是在窗口變得沒法訪問, 他們將被寫入到磁盤。 dom

您能夠指定在工做簿窗口大小經過施工時間 新SXSSFWorkbook(int windowSize) 或者你能夠把它per-sheet經過 SXSSFSheet # setRandomAccessWindowSize(int windowSize) xss

當建立一個新行經過createRow()和總數 不能記錄將超過指定的窗口大小,而後 行索引值最低的刷新和沒法訪問 經過getRow()了。 this

默認的窗口大小 100年 並經過SXSSFWorkbook.DEFAULT_WINDOW_SIZE定義。 spa

windowSize 1表示無限的訪問。 在這種狀況下全部的 記錄沒有被調用刷新flushRows()是可用的 隨機存取。 code

注意,SXSSF分配臨時文件 必須 老是顯式清理,經過調用dispose方法。 orm

SXSSFWorkbook默認使用內聯字符串而不是共享的字符串 表。 這是很是有效的,由於不須要保存在文檔內容 內存,但也是產生不兼容的文檔 一些客戶。 與全部獨特的字符串在字符串啓用共享文檔 必須保存在內存中。 根據你的文檔內容能夠使用 比使用共享更多的資源字符串禁用。 xml

仔細檢查你的記憶在決定前預算和兼容性的需求 是否啓用共享字符串。 索引

下面的例子寫一張100行之窗。 當行數達到101, rownum = 0的行是刷新到磁盤,從內存,當rownum達到102而後rownum = 1的行是刷新,等等。 ip

import junit.framework.Assert;
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.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

    public static void main(String[] args) throws Throwable {
        SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
        Sheet sh = wb.createSheet();
        for(int rownum = 0; rownum < 1000; rownum++){
            Row row = sh.createRow(rownum);
            for(int cellnum = 0; cellnum < 10; cellnum++){
                Cell cell = row.createCell(cellnum);
                String address = new CellReference(cell).formatAsString();
                cell.setCellValue(address);
            }

        }

        // Rows with rownum < 900 are flushed and not accessible
        for(int rownum = 0; rownum < 900; rownum++){
          Assert.assertNull(sh.getRow(rownum));
        }

        // ther last 100 rows are still in memory
        for(int rownum = 900; rownum < 1000; rownum++){
            Assert.assertNotNull(sh.getRow(rownum));
        }
        
        FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
        wb.write(out);
        out.close();

        // dispose of temporary files backing this workbook on disk
        wb.dispose();
    }

下一個示例關閉清洗法(windowSize = 1)和代碼手動控制部分的數據寫入磁盤

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.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

    public static void main(String[] args) throws Throwable {
        SXSSFWorkbook wb = new SXSSFWorkbook(-1); // turn off auto-flushing and accumulate all rows in memory
        Sheet sh = wb.createSheet();
        for(int rownum = 0; rownum < 1000; rownum++){
            Row row = sh.createRow(rownum);
            for(int cellnum = 0; cellnum < 10; cellnum++){
                Cell cell = row.createCell(cellnum);
                String address = new CellReference(cell).formatAsString();
                cell.setCellValue(address);
            }

           // manually control how rows are flushed to disk 
           if(rownum % 100 == 0) {
                ((SXSSFSheet)sh).flushRows(100); // retain 100 last rows and flush all others

                // ((SXSSFSheet)sh).flushRows() is a shortcut for ((SXSSFSheet)sh).flushRows(0),
                // this method flushes all rows
           }

        }

        FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
        wb.write(out);
        out.close();

        // dispose of temporary files backing this workbook on disk
        wb.dispose();
   }

SXSSF衝單數據在臨時文件(每單臨時文件),這些臨時文件的大小 能夠長到一個很是大的價值。 例如,對於一個20 MB csv數據大小的臨時xml成爲超過十億字節。 若是臨時文件的大小是一個問題,你能夠告訴SXSSF使用gzip壓縮:

SXSSFWorkbook wb = new SXSSFWorkbook(); 
  wb.setCompressTempFiles(true); // temp files will be gzipped
相關文章
相關標籤/搜索