亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

現在的需求是,只要生成一個Excel文件,希望能達到20W行,在內存512的范圍內,求解決方案。

現在的需求是,只要生成一個Excel文件,希望能達到20W行,在內存512的范圍內,求解決方案。

弒天下 2022-10-02 13:09:29
 我們在做一個報表導出的功能,WEB 容器Server使用TOMCAT6,JVM可用的內存范圍只有512M,導出報表使用excel需要下載到本地。 現在遇到性能問題,我現在采用的是POI的HSSF導出,導出的數據來自數據庫中的多個表,列最多時,列的個數為110列,如果數據一次性導出會OutOfMemory。 我們現在的做法是,每8K條記錄導出到一個Excel的一個Sheet,為一個文件;寫成多個文件,最后把生成的多個文件打包成一個壓縮包反回客戶端。
查看完整描述

2 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

先確定一下你的格式,到底是xlsx還是xls,看你說想要有20萬行,我印象里面xls是沒法到20萬行的(最多65535行),列也有限制(貌似255),但是xlsx是沒這個限制的(或者說限制寬松很多)

如果是xlsx的話,你可以新建一個xlsx文件,然后把后綴改成zip,然后解壓縮,看看生成的結果,是一堆文本文件。然后你加一行數據,再改后綴,解壓縮,看看結果,你會發現,xlsx文件的更新實際上就是更新xml的一個操作。
那么你應該明白了,你后臺需要做的就是做xml文件,然后zip壓縮后把后綴改成xlsx,這樣的話,不會涉及到POI那些很耗內存的操作,應該是很容易做到你要的效果的。

如果是xls格式,那么首先行數達不到你的要求。如果強行要做,那么推薦你還是先把數據查出來放在文本文件里面,然后調用另一個process來在外部運行來完成這步工作(或者干脆連查詢所有的事情都交給外部進行,這時候是啟動另一個java虛擬機,占用的是別的內存,甚至可以交給別的server來干這件事),你的程序可以輪詢這個工作做完沒有,做完后再下載。

說實話,我覺這種需求的正路就是應該是異步另外一個process去做,做完之后再下載。
否則用戶畫面上點個按鈕,數據量超大的情況下你讓他等20分鐘是不是很蠢?應該給他一個機制告訴他這個事很花時間,現在正在做,做完后讓他自己下載是比較合適的作法。

如果一定要在畫面上的一次請求搞定的話,參考我說的用xlsx或者輪詢另外一個process的作法應該能搞定你的需求。

查看完整回答
反對 回復 2022-10-06
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

能使用xls格式的嗎? 如果可以就簡單了

查看完整回答
反對 回復 2022-10-06
  • 2 回答
  • 0 關注
  • 320 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號