1. 程式人生 > >EXCEL大資料匯出(100W條)

EXCEL大資料匯出(100W條)

     EXCEL匯出,如果說上了數十萬條,那麼走記憶體直接一次性匯出相當的困難,我本地的記憶體調的相對較小,所以大概5-6萬條就不行了,我在createCell加了一個輸出語句,迴圈到5-6萬條,就會非常非常慢,每次createCell一次,需要5-10S,後面會越來越慢。解決這種事情,一般的解決思路是,每次到一定量的資料就輸出到一個檔案,最後彙總成一個檔案。POI提供了SXSSFWorkbook,判斷一下,然後直接利用多型的思想,進行類的繫結,對於我們這些程式設計師來說還是非常方便的。

              Workbook  workbook;

   if(arlist.size()<50000){
   workbook = new XSSFWorkbook();
   }else{
   workbook = new SXSSFWorkbook();
   }

   將一定的兩的資料輸出到一個檔案,最後彙總,當然這是有很多可以優化的地方,我看一下,POI的寫法,它是壓縮了檔案,然後最後write的時候進行解壓,如果不進行壓縮直接進行讀取,效率可能會更高,但是相對臨時空間可能需要更大,下面是POI的write中呼叫InjectData的程式碼

  private void injectData(File zipfile, OutputStream out) throws IOException 
    {
        ZipFile zip = new ZipFile(zipfile);
        try
        {
            ZipOutputStream zos = new ZipOutputStream(out);
            try
            {
                @SuppressWarnings("unchecked")
                Enumeration<ZipEntry> en = (Enumeration<ZipEntry>) zip.entries();
                while (en.hasMoreElements()) 
                {
                    ZipEntry ze = en.nextElement();
                    zos.putNextEntry(new ZipEntry(ze.getName()));
                    InputStream is = zip.getInputStream(ze);
                    XSSFSheet xSheet=getSheetFromZipEntryName(ze.getName());
                    if(xSheet!=null)
                    {
                        SXSSFSheet sxSheet=getSXSSFSheet(xSheet);
                        InputStream xis = sxSheet.getWorksheetXMLInputStream();
                        try
                        {
                            copyStreamAndInjectWorksheet(is,zos,xis);
                        }
                        finally
                        {
                            xis.close();
                        }
                    }
                    else
                    {
                        copyStream(is, zos);
                    }
                    is.close();
                }
            }
            finally
            {
                zos.close();
            }
        }
        finally
        {
            zip.close();
        }
    }