2014年12月18日 星期四

Laravel-Excel 匯出 Excel (xls) 心得

最近在工作上一直處理匯出報表這件事情,整體來說, Laravel-Excel 已經能符合大部分的需求,安裝與使用上,也不是很複雜 (難的是撈資料啊....)。


不過,有個很懊惱的問題是,如同這位先生問的一樣:
exporting large files in separate sheets

我的問題不完全跟他一樣,但重點很像。如果資料量太大,要用 excel 匯出,會非常吃 memory,(PHPExcel是在 memory 中處理所有資料),一等就是遙遙無期 ( 我改用 fputcsv 超級快... 但是在mac會有亂碼問題 ),可能檔案還沒下載下來,畫面就先掛掉了,除此之外,你還可能會經歷兩種 fatal error:

(1) PHP Fatal error:  Allowed memory size of 16777216 bytes exhausted (tried to allocate 32 bytes)

(2) PHP Fatal error:  Maximum execution time of 60 seconds exceeded


第一個是,memory 不夠了,怎麼辦?! 你願意拿 memory 來換 xls 檔嗎? 可以的話,就不用吝嗇付出更多的 memory,設定一下 memory_limit (example: ini_set('memory_limit', '1G')) 。

第二個,時間不夠用。你可以等嗎? 那你可以把 max_execution_time 調高 ( ini_set('max_execution_time', 600);)。


以上兩種調整,可以讓 xls 成功匯出,但可能一等就是十分鐘,經測試,絕對不是 Query 慢,再慢也不會是這樣,而是 PHP 會等資料都 ready 好之後,再放到 xls 檔,所以佔用記憶體,你必須等...。

還有一種方法,就是把這樣的任務放到 background 去跑,礙於時程壓力,經驗不夠,我沒有走這種方式,我也不曉得測出來的結果如何,簡直悲劇一場。

結論: 我不想讓客戶久等,我暫時用 fputcsv 來擋一下當時專案匯出報表的需求...。至於 xls 我目前只會用在小量資料匯出。

(PS: fputcsv 要處理 select query 回來的 2 維陣列,又有一點麻煩之處,有空再紀錄 xdd)

沒有留言:

張貼留言

若你看的文章,時間太久遠的問題就別問了,因為我應該也忘了... XD

Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...