1. 程式人生 > >超級噁心的大批量資料匯出到Excel

超級噁心的大批量資料匯出到Excel

真無語了,咋那麼多客戶要匯出資料到Excel?還都動不動就好幾萬條到幾十萬?匯出了都看不看啊,真是倒黴催的。唉,牢騷一頓,進入正題。

業務功能比較簡單就是把資料庫內的資料,匯出到Excel檔案,檔案裡也沒有什麼修飾,比如顏色,底紋之類的啥都不帶,純資料檔案,客戶要拿這個檔案檢視,做些篩選之類的操作。

  起初就是用poi,很簡單的方式,生成Excel並輸出到輸出流,直接讓使用者下載。可惜好景不長,突然資料到了19w條,撐不住了,5萬左右就記憶體溢位了,網上找了很多文章,基本上都無法搞定。

1.首先,poi和jxl這2個主要開發包,都是要把Excel放入記憶體,最後寫檔案的時候一起寫入。所以寫入之前所有的row,cell都在記憶體,不能釋放,造成記憶體溢位。也因為以上原因,分次寫入也是行不通的。

2.網上有篇文章“解決大批量資料匯出Excel產生記憶體溢位的方案”,方法是生成一些小的臨時檔案,最後再合併為大檔案,而且用了一些poi的二進位制方式。但是使用以後,能處理的資料增加了一倍,但是還是難逃溢位的厄運。文章作者說可以避免溢位,但是我這確實不行。二進位制寫入的方式我是實在找不到文件,也作罷。

   實在無奈,想起了很早以前,使用odbc操作Excel的方式,一試,還真行,不帶溢位的。本來嘛,就是迴圈執行些sql語句,這要是再溢位,只能怪自己太爛了。如下

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  String url = "jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};readOnly=false;DBQ=d://t.xls";
  Connection con = DriverManager.getConnection(url);

連線好Excel後,直接insert,沒錯。url中readOnly=false是必須的,否則無法寫入。至於sheet,可以使用poi或jxl建立,也能用資料庫連線後的create table建立,方便得很。

有缺陷的話,就是隻能在windows上執行,不能處理樣式。終極解決方式還是bin模式。

還有一種方法,就是用XMl方式儲存Excel,就是某些Excel特性不支援了,比如嵌入圖片。

在此記錄一下,備忘。