第210期 / April 5, 2015

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

多瀏覽器Excel圖表產出分析與應用

作者/余世堯

[發表日期:2015/4/5]

前言

在這瞬息萬變的時代,面對各種變遷,迅速地做出適當的決策是身為一個領導者帶領整個企業走向成功不可或缺的一項要素。而與過往缺乏資訊來進行判斷不同,資訊過多難以釐清重點反而成了現今做出決策最大的難題。

而為了處理這龐大的資訊,各企業也導入的各種不同的電腦系統來協助整理、分析。除了透過電腦進行彙整分析外,如何呈現結果以方便閱覽亦成為一個值得商討的問題。

圖表因為具有易於比較、視覺化的呈現…等特性而成為了常見的呈現方式之一。其中Excel的圖表相較於PDF、圖片…格式,因具有容易重新計算的性質,而成為了首選。

Excel產出元件簡易比較

一、ActiveX + Visual Basic for Application (VBA)

這是於早期的ASP程式開發中,經常用來產生Excel報表的方式之一。而此種方式有兩大限制。其一,使用者端必須安裝有Microsoft Office Excel程式,且必須對產生報表之程式提供較大的安全性空間,方能順利產出。其二,因透過ActiveX去進行VBA之操作,故瀏覽器綁定於Microsoft Internet Explorer系列,若欲透過其他瀏覽器進行操作,雖可透過安裝特定的外掛套件來達成,但支援仍不完整。

二、Microsoft.Office.Interop.Excel 元件

此元件為.Net架構下,Microsoft官方提供的產生Excel之標準方法。惟此法依舊必須透過Microsoft Excel進行操作,對於一個Web Service而言,就必須於伺服器端安裝Microsoft Office Excel。而Microsoft Office Excel於設計時又被定義為個人軟體,故其對於多人操作與共享的支援性較差。這對於一個Web Service而言,容易造成Microsoft Office Excel程序無法被正確釋放,Server的記憶體被大量占用,進而導致Server的不穩定。

三、第三方元件─NPOI與EPPlus

由於前述兩種方法的種種限制,故而有開發者開始尋找直接存取Excel的方法。其中Java開發人員拜Apache的POI專案所賜,能以一種較輕鬆的方式去進行Office檔案的存取。而於.Net的領域中,目前以NPOI與EPPlus較廣為人知。

NPOI與Apache的POI只差一個字不是沒原因的,NPOI正是將Java中的POI移植到.Net上的成果。NPOI專案對於Excel的存取採用的是直接存取其文件格式,因此無須透過Microsoft Office Excel進行操作。這對於Web Service而言,這免去了Microsoft Office Excel程序可能無法正確釋放的風險。

NPOI目前支援.xls與.xlsx,但可惜的是兩種格式的文件於NPOI內部的元件設計並不相同。換言之,若開發的系統欲同時支援兩種格式,則必須撰寫兩份不同的程式碼來進行文件的產出。

EPPlus與NPOI相似,但EPPlus僅支援.xlsx的格式。與NPOI同樣的,兩者皆支援以資料流的方式來進行文件的輸出,與Microsoft.Office.Interop.Excel相比,當開發一個Web Service時,省去了檔案管理的動作,避免了無用的檔案累積在伺服器上的可能性。

NPOI與EPPlus兩者皆屬於開源軟體的專案,差別在於一者的授權是Apache2,另一者則是LGPL。做為一個企業的系統開發輔助元件而言,開源的程式碼提供了檢視其內容的可能性,可避免元件中暗藏後門產生的資安漏洞。

不論是NPOI與EPPlus,畢竟是第三方的原件,於圖表功能的支援上無法與VBA和Microsoft.Office.Interop.Excel這兩種方式相提並論。其中NPOI於.xls文件格式上的支援較完整,而於.xlsx上的圖表支援則處於剛起步的狀態。而EPPlus則支援大部分的圖表類型。考量使用Microsoft Office 2003之前版本的使用者逐日減少之故,因此本文章後述的實例將以EPPlus為主。

四、優缺點對照表



EPPlus使用技巧實例

由於EPPlus授權採取LGPL,在不願開放部分原始碼的情況下,修改其原始碼來支援額外功能將會有智慧財產權上的爭議。

因此,於本段落中,不僅將介紹一些EPPlus較傳統的VBA與Microsoft.Office.Interop.Excel優秀的地方,亦將介紹一些Excel文件設計上的技巧。透過這些技巧,可以在不修改原始碼的情況下,將部分EPPlus不支援但較常使用的一些圖表呈現方式進行實現。

一、串流輸出

於Web Service上提供Excel報表時,Microsoft.Office.Interop.Excel必須先在伺服器端產生實體檔案,單一檔案或許並不大,但累積下來還是會造成伺服器的負擔,因此必須額外進行檔案清除的作業。

若採用VBA,則使用者端獲得的檔案名稱將被固定,若要因資料來決定檔名的話(如:資料月份),則還是需要在伺服器端先產生實體檔,因此也將面臨相同的問題。

EPPlus與這兩種方式不同的地方在於能夠允許串流輸出,因此當我們透過程式碼產生完一份Excel報表後,無需將它儲存成實體檔,直接透過串流的方式傳送至使用者端,即可免去清檔的過程。

程式碼範例如下:


二、單一資料點顏色修改


《圖一》目標效果

以折線圖而言,EPPlus目前僅允許整條線進行顏色變更,而無法進行單一資料點的顏色調整,而這又是一個報表常見的呈現手法(標示特定月份、特定日期),但我們可以於報表上以多張圖表重疊的方式來達到這樣的需求。

《圖三》與《圖四》分別是折線圖與XY散佈圖,而透過這兩張圖的疊合,就可以呈現出我們想要的效果。


《圖二》折線圖


《圖三》XY散佈圖


《圖四》折線圖+XY散佈圖

重疊後的效果如《圖四》所示,但我們需要的是單點顏色改變,所以XY散佈圖的部分,應只選取一個點的資料量即可。

實際操作步驟如下列圖片所示(以Microsoft Office 2010為例):

1. 新增圖表區(折線圖)

2. 選取資料(折線圖)

3. 折線圖結果

4. 新增第二條數列

5. 右鍵點擊第二條數列,選取變更圖表類型,變更為XY散佈圖

6. 重新進行第二條數列的資料選取動作,此時會有XY資料可做選擇

7. 完成圖


結論

透過圖表,可以讓使用者以視覺化的方式看出資料的趨勢(如增減、比例…等),而Excel圖表較Pdf、圖片…等格式更為優秀的地方在於可以讓使用者自行調整部分參數。

而在目前盛行的Web型態的服務機制上,傳統的一些產生Excel文件的方式已不敷使用,因此於本文中推薦了另一套文件產出的共用元件─EPPlus。

EPPlus具有支援圖表格式較多、可提供串流輸出…等優點,而部分缺點亦可透過Excel文件的設計來進行彌補。在透過Excel文件設計技巧的彌補過後,整體的支援性即可滿足大多數報表的需求。

而且EPPlus是一個持續在開發修正的專案,該專案最後一次的Release於2015/01/14,於此版本中又新增了十餘種Function的支援。雖仍有不足的部分,但可提供給該專案的開發團隊,期使在未來能滿足更多不同的需求。

參考資料

1. Excel 存取工具揣摩_2013年六月號電腦科技電子報(第188期)
2. NPOI 官網
3. EPPlus 官網