EXCEL大資料匯出(100W條)
阿新 • • 發佈:2019-02-13
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(); } }