以往我們在基于POI生成Excel檔案時,都是利用官方提供的HSSF或XSSF對應的系列API,它們操作簡便,上手比較快。但是對于大資料量的Excel檔案生成往往會比較耗時,這是我們利用标準的API進行開發的一個痛點。對于性能更高一點的API,POI官方會建議我們使用SXSSF系列API,雖然它的性能比起HSSF和XSSF會有很大的提高,但是面對大量資料的時候還是會比較慢,為此官方還給我們提供了一種基于XML的方案。
其實對于一個Excel檔案來說,最核心的是它的資料。Excel檔案中的資料和樣式檔案是分開存儲的,它們都對應于它自己體系中的一個XML檔案。有興趣的朋友可以把Excel檔案的字尾名改成“<code>.zip</code>”,然後用壓縮檔案把它解壓縮,可以看到它裡面的結構是由一堆的XML檔案組成的。如果我們把解壓縮後的檔案再壓縮成一個壓縮檔案,并把它的字尾名改為Excel檔案對應的字尾名“<code>.xlsx</code>”或“<code>.xls</code>”,然後再用Excel程式把它打開。這個時候你會發現它也是可以打開的。筆者本文所要講述的基于大量的資料生成Excel的方案就是基于這種XML檔案的方案,它依賴于一個現有的Excel檔案(這個Excel檔案可以在運作時生成好),然後把我們的資料生成對應的XML表示,再把我們的XML替換原來的XML檔案,再進行打包後就變成了一個Excel檔案了。基于這種方式,筆者做了一個測試,生成了一個擁有3500萬行,5列的Excel檔案,該檔案大小為1GB,耗時412秒。這種效率比起我們應用傳統的API來說是指數倍的。
(注:本文由Elim寫于2017年6月5日)