針對上一篇随筆收到的回報,在展開對ExcelReport源碼解析之前,我認為把編寫該元件時的想法分享給大家是有必要的。
編寫該元件時,思考如下:
為什麼要将樣式、格式與資料分離呢?恩,你不妨想一想在生成報表時,那些是變的而那些又是不變的。我的結論是:變的是資料。
有了這個想法,很自然的想到用模闆去承載不變的部分(常量内容的樣式、格式、資料及變量内容的樣式、格式),在程式中控制變的部分(變量内容的資料)。
這裡以上一篇中的例子辨別:

變量内容已使用粉紅色邊框标出,其餘為常量内容。好了,相信“内容的資料”大家都知道那個是那個的。下面截圖,内容的樣式和格式。
現在我們回到上篇中使用的模闆,相信你應該知道它承載那些東西了。
啰嗦了這麼多,總結一下樣式、格式與資料分離的好處:它讓我們編寫程式時關注更少(隻需關心“變量内容的資料”)。
為什麼要抽象一個“元素格式化器”的概念呢?我們看資料源,我們有可能要将某個類型的資料填充到某個單元格、也可能将一個集合填充到多行、有可能将一張圖檔填充到某個位置、也有可能就将某個字元串合并到某個單元格的内容中......如此種種。那麼它們有什麼共同點呢?它們都是填充“變量内容的資料”到模闆的。
有了上面的背景,這張UML想必不難了解了。
當然,如果你還是覺得複雜, 沒關系。我會先介紹一下這裡面幾個重點關系。
這是一個靜态類,非常簡單。隻有兩個靜态方法:ExportToLocal()、ExportToWeb()分别将生成的檔案導出到本地和Web。這多半是廢話了,下面是重點:
這便引出了SheetFormatterContainer類,SheetFormatterContainer類是何許也?
SheetFormatterContainer是一個存儲“格式化一個Sheet用到的元素格式化器集合”的容器。
說到這,順便說下:ElementFormatter類和SheetFormatterContext類。
ElementFormatter:元素格式化器。
SheetFormatterContext:Sheet格式化上下文。
回到Export:
如上代碼,在執行導出的過程中,将每一個SheetFormatterContainer對象轉換成了SheetFormatterContext對象。然後SheetFormatterContext對象調用自身的Format()方法格式化Sheet。
Formatters就是從SheetFormatterContainer傳過來的“元素格式化器”集合。
抽象的“元素格式化器”:
至此,ExcelReport元件的核心部分已經介紹完成了,下面附上代碼(如下代碼僅供參考,了解ExcelReport元件最新動态,請到GitHub下載下傳最新源碼)。
SheetFormatterContainer.cs
SheetFormatterContext.cs
ElementFormatter.cs
CellFormatter.cs
TableFormatter.cs
ExportHelper.cs
Export.cs
Parameter.cs
ParameterCollection.cs
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
本文轉自韓兆新部落格部落格園部落格,原文連結:http://www.cnblogs.com/hanzhaoxin/p/4240398.html,如需轉載請自行聯系原作者