原文地址:服務端指南 | 報表匯出
部落格地址:blog.720ui.com/
有的時候,我們需要將一部分報表資料以 Excel 檔案的形式進行匯出,並以離線的方式進行查閱。對於 Excel 報表匯出,一種做法是服務端提供 JSON 格式的報表資料,前端基於 HTML5 的 JavaScript 功能控制元件實現 Excel 的匯出功能,這種做法的好處在於服務端的 API 介面具有複用性,減少服務端的效能壓力,並將生成報表的壓力轉移到了前端。但是,如果存在 Excel 的樣式渲染,就有點力不從心了。
另一種做法是全部由服務端實現 Excel 的生成與渲染,並提供給前端進行匯出。Java 語言中,最常用的操作 Excel 的類庫包括 jxl 和 poi。 jxl 是一個比較老的框架,只能支援低版本的 excel,即 .xls 格式的 Excel,比如 Excel 95, Excel 97, Excel 2000, Excel 2003 等版本,但是在 65535 行以下量級的資料效能更好些。poi 是 apache 的專案,可以支援 .xlsx 格式的 Excel,包括 Excel 2007, Excel 2010 等版本。因此,現在主流操作 Excel 的類庫是 poi。現在,我們來參考 poi 操作 Excel 的類圖。
值得注意的是,一般情況下,報表匯出是同步執行,通過位元組流的方式與前端通訊。此外,我們也可以將生成的 Excel 報表檔案先上傳的資源中心,並生成 URL 地址返回給前端供使用者下載,這樣可以利用 CDN(內容分發網路)將網路內容釋出到靠近使用者的邊緣節點,使不同地域的使用者在訪問相同網頁時可以就近獲取。
為了減少服務端的壓力,對於報表匯出的數量需要進行限制,例如一次只能匯出 5 萬條記錄,並且建議使用者分批匯出。
此外,如果資料來源都是在存放在當前系統中,那麼處理起來就方便地多,只需要通過 JDBC 獲取到資料來源並且進行 Excel 的生成與渲染。然而,如果部分資料來源儲存在外部系統中,那麼就需要 RPC 呼叫或者 RESTful API 呼叫才能獲取到。這樣,一方面會很大影響到效能,另一方面可能存在介面呼叫超時。此時,優先考慮將資料冗餘到本地,其次折中的處理方案是,呼叫失敗或者呼叫超時進行重試來實現資料補償,並且在重試之後無法獲取到某些外部資料時,進行一個友好的提示,例如“系統太累了,暫時沒有取到喲”。
有時,報表匯出等待時間太久會導致 Nginx 超時,我們可以將報表匯出改變成非同步方式,當使用者發起報表匯出請求後,服務端立即響應應答,並非同步執行 Excel 的生成與渲染。當完成任務時,通過訊息佇列或者心跳包機制通知前端進行下載。
(完)
更多精彩文章,盡在「服務端思維」微信公眾號!