天天看點

ExcelReport第二篇:ExcelReport源碼解析

針對上一篇随筆收到的回報,在展開對ExcelReport源碼解析之前,我認為把編寫該元件時的想法分享給大家是有必要的。

編寫該元件時,思考如下:

為什麼要将樣式、格式與資料分離呢?恩,你不妨想一想在生成報表時,那些是變的而那些又是不變的。我的結論是:變的是資料。

有了這個想法,很自然的想到用模闆去承載不變的部分(常量内容的樣式、格式、資料及變量内容的樣式、格式),在程式中控制變的部分(變量内容的資料)。

這裡以上一篇中的例子辨別:

ExcelReport第二篇:ExcelReport源碼解析

變量内容已使用粉紅色邊框标出,其餘為常量内容。好了,相信“内容的資料”大家都知道那個是那個的。下面截圖,内容的樣式和格式。

ExcelReport第二篇:ExcelReport源碼解析
ExcelReport第二篇:ExcelReport源碼解析

現在我們回到上篇中使用的模闆,相信你應該知道它承載那些東西了。

ExcelReport第二篇:ExcelReport源碼解析

啰嗦了這麼多,總結一下樣式、格式與資料分離的好處:它讓我們編寫程式時關注更少(隻需關心“變量内容的資料”)。

為什麼要抽象一個“元素格式化器”的概念呢?我們看資料源,我們有可能要将某個類型的資料填充到某個單元格、也可能将一個集合填充到多行、有可能将一張圖檔填充到某個位置、也有可能就将某個字元串合并到某個單元格的内容中......如此種種。那麼它們有什麼共同點呢?它們都是填充“變量内容的資料”到模闆的。

有了上面的背景,這張UML想必不難了解了。

ExcelReport第二篇:ExcelReport源碼解析

當然,如果你還是覺得複雜, 沒關系。我會先介紹一下這裡面幾個重點關系。

這是一個靜态類,非常簡單。隻有兩個靜态方法:ExportToLocal()、ExportToWeb()分别将生成的檔案導出到本地和Web。這多半是廢話了,下面是重點:

ExcelReport第二篇:ExcelReport源碼解析

這便引出了SheetFormatterContainer類,SheetFormatterContainer類是何許也?

SheetFormatterContainer是一個存儲“格式化一個Sheet用到的元素格式化器集合”的容器。

說到這,順便說下:ElementFormatter類和SheetFormatterContext類。

ElementFormatter:元素格式化器。

SheetFormatterContext:Sheet格式化上下文。

回到Export:

如上代碼,在執行導出的過程中,将每一個SheetFormatterContainer對象轉換成了SheetFormatterContext對象。然後SheetFormatterContext對象調用自身的Format()方法格式化Sheet。

Formatters就是從SheetFormatterContainer傳過來的“元素格式化器”集合。

ExcelReport第二篇:ExcelReport源碼解析

抽象的“元素格式化器”:

ExcelReport第二篇:ExcelReport源碼解析

至此,ExcelReport元件的核心部分已經介紹完成了,下面附上代碼(如下代碼僅供參考,了解ExcelReport元件最新動态,請到GitHub下載下傳最新源碼)。

ExcelReport第二篇:ExcelReport源碼解析

SheetFormatterContainer.cs

SheetFormatterContext.cs

ElementFormatter.cs

CellFormatter.cs

TableFormatter.cs

ExportHelper.cs

Export.cs

Parameter.cs

ParameterCollection.cs

ExcelReport第二篇:ExcelReport源碼解析

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

本文轉自韓兆新部落格部落格園部落格,原文連結:http://www.cnblogs.com/hanzhaoxin/p/4240398.html,如需轉載請自行聯系原作者

繼續閱讀