我們開發(fā)程序的時候绵载,經(jīng)常會碰到一些報表饲梭,如果是Winform的報表期吓,一般可以采用DevExpress控件組的XtraReport早歇,或者微軟的RDLC報表,當然還有一些其他的讨勤,在此不再贅述箭跳。由于本人在Winform開發(fā)中經(jīng)常使用到一些報表,有時候使用XtraReport報表潭千,有時候也使用RDLC報表刨晴,因此本篇主要介紹這兩種不同類型報表的使用,以及對比它們的差異性茄靠,以便我們更好的掌握了解慨绳。
1脐雪、XtraReport報表的使用
1)報表界面展示
在我的派車管理系統(tǒng)里面,我需要根據(jù)數(shù)據(jù)庫的記錄召锈,把相關的派車歷史信息做成一個報表統(tǒng)計的模塊涨岁,需要列出報表的明細(派車明細)和統(tǒng)計值(記錄數(shù)梢薪、公里數(shù))秉撇,這種類型的報表是很多情況下需要碰到的琐馆。
我需要實現(xiàn)一個基于XtraReport報表技術(shù)實現(xiàn)的功能界面瘦麸,如下面圖示所示滋饲。
這里面涉及的字段屠缭,包括字符型呵曹、日期型逢并,數(shù)值型郭卫、枚舉類型等贰军,還有統(tǒng)計值俯树、打印時間(參數(shù))贰盗,因此也算一個比較完整的報表展示了舵盈。
2)創(chuàng)建新報表
為了實現(xiàn)這個報表模塊秽晚,我們先使用VS的工具創(chuàng)建一個報表組件對象赴蝇。
在使用前句伶,我們需要設置好報表組件的各個顯示模塊考余,報表報表上下空間部分(TopMargin/BottomMargin)秃殉,這兩個部分用來調(diào)整上下的邊線的;
然后每個報表有頭部內(nèi)容和底部內(nèi)容的區(qū)分鳄袍,ReportHeader一般用來放置表格頭部字段顯示的拗小,明細的內(nèi)容包括展示列表的明細信息哀九,大致調(diào)整如下所示阅束。
3)設計報表控件和數(shù)據(jù)源管理
在VS左邊的工具箱里面有響應的XtraReport控件息裸,拖動到報表界面里面就可以進行繪制設計了呼盆。
為了實現(xiàn)表格統(tǒng)計和展示厨幻,我們需要拖動兩個表格到報表界面里面去腿时,一個是報表頭字段圈匆,一個用來顯示報表明細的列表內(nèi)容跃赚,兩個單元格的寬度設置一致纬傲,并且上下空間要挨著叹括,否則顯示出來就有空間,不好看净嘀。
表格拖動過去后挖藏,可以使用右鍵添加相應的單元格膜眠,然后統(tǒng)一設置他們的背景顏色宵膨,高度寬度辟躏,邊框等屬性即可土全。
表格頭我們可以填寫相關的文字替代涯曲,但是報表的明細信息,我們需要綁定相應的字段內(nèi)容拨黔,因此需要增加一個數(shù)據(jù)源用來綁定到報表上去篱蝇。
在報表屬性里面零截,找到DataSource進行配置涧衙,如下所示弧哎。
拖動相關的表格撤嫩,然后設計其界面序攘,并綁定明細單元格的內(nèi)容為[ABC]這樣的格式程奠,就標識綁定了一個ABC的字段屬性了梦染。如下所示是綁定了一個HandNo的字段顯示朴皆。
最終設計的報表界面如下所示肮疗。
4)特殊字段的處理
在報表的設計過程中伪货,我們一般會碰到各種不同的字段,它不是簡單的文本信息蒙挑,可能是日期忆蚀,也可以是統(tǒng)計值馋袜,計算值等欣鳖。
打印時間泽台,只需要增加一個XRPageInfo师痕,然后設置里面的值就可以了胰坟,這個有點類似RDLC的參數(shù)值泞辐。
從上面我們可以看到有很多項目可以選的吹缔,除了有時間厢塘,還有記錄數(shù)肌幽、總記錄數(shù)喂急、用戶名廊移、總數(shù)等等。
記錄數(shù)的統(tǒng)計設計如下所示懂诗,主要是通過千制的方式顯示响禽,調(diào)用Count函數(shù)處理芋类。
同樣侯繁,總公里數(shù)贮竟,是統(tǒng)計整個報表里面記錄的公里數(shù)操作咕别,調(diào)用SUM函數(shù)處理惰拱,它的設計界面如下偿短。
設計好Xtra報表后昔逗,我們就可以程序里面勾怒,直接調(diào)用進行加載處理即可笔链,代碼如下所示艾少。
private void PrintReport()
{
string where = GetConditionSql();
List<CarApplyInfo> list = BLLFactory<CarApply>.Instance.Find(where);
FrmHistoryReport report = new FrmHistoryReport();
report.DataSource = list;
ReportPrintTool tool = new ReportPrintTool(report);
tool.ShowPreview();
}
我們主要獲取數(shù)據(jù)源幔妨,并綁定數(shù)據(jù)源到對應的報表組件上,然后調(diào)用ReportPrintTool 進行展現(xiàn)即可古话,代碼非常簡潔陪踩,只是設計過程麻煩一些悉抵。
2、RDLC報表的使用
在我《會員管理系統(tǒng)的設計和開發(fā)(2)-- RDLC報表的設計及動態(tài)加載》里面傻谁,有對RDLC報表設計做了一些介紹审磁,RDLC是微軟的報表格式态蒂,它是一個相對比較獨立的文件,是一個基于XML描述性的文件钾恢,除了可以用在Winform上外赘那,也可以用在Web上募舟,通用性也非常不錯闻察。
基于對比的考慮辕漂,我也為同樣的模塊設計了一個一樣的報表钉嘹,RDLC報表最終展示界面如下所示。
和前面XtraReport的報表界面做一個對比缨睡。
兩者的展現(xiàn)效果都差不多细诸,只是界面效果有一些差異而已陋守。
1)RDLC的設計效果
由于RDLC它是一個獨立的XML文件猩系,它的描述全部在一個XML里面蝙眶,因此我們設計的時候褪那,只是對XML文件進行處理博敬,VS給我們提供了一個設計器及進行設計而已偏窝。
在RDLC的設計視圖里面武学,我們可以看到報表數(shù)據(jù)里面火窒,包括一些預定義的數(shù)據(jù)熏矿,以及我們添加進去的數(shù)據(jù)源票编。
當然報表設計少不了相關的控件慧域,因此在工具欄里面昔榴,可以看到可以用的報表控件元素碘橘,如下所示蛹屿。
2)報表特殊元素的處理
RDLC報表错负,也有一些如打印時間犹撒,分頁數(shù)據(jù)等粒褒,是需要特殊的處理了奕坟,打印時間是使用報表數(shù)據(jù)里面的【內(nèi)置字段】項目月杉,如下所示。
對于記錄總數(shù)和統(tǒng)計值,我們可以通過自定義的格式內(nèi)容進行處理蛙酪,如下所示桂塞。
統(tǒng)計總數(shù)的操作設計如下藐俺,調(diào)用SUM函數(shù)即可欲芹,如果忘記是那個吟吝,可以在下面類別里面進行查詢,里面有很多運算符官辽、常見函數(shù)等內(nèi)容可以使用同仆。
另外俗批,對于一些特殊的顯示格式岁忘,我們需要正確設置干像,如下是日期的格式設置麻汰。
3)報表的調(diào)用處理
由于報表的展現(xiàn)模塊什乙,我已經(jīng)放到了一個獨立的通用模塊里面,因此對于報表的加載智亮,只需要簡單的設置屬性点待,然后調(diào)用即可癞埠,如下所示颠区。
private void PrintRDLCReport()
{
string where = GetConditionSql();
List<CarApplyInfo> list = BLLFactory<CarApply>.Instance.Find(where);
foreach (CarApplyInfo info in list)
{
info.Data1 = info.Status.ToString();//轉(zhuǎn)換枚舉類型描述
}
ReportViewerDialog dlg = new ReportViewerDialog();
dlg.Text = "歷史記錄報表";
dlg.DataSourceDict.Add("CarApplyInfo", list);
dlg.ReportName = "WHC.CarDispatch.HistoryReport";
dlg.IsPrintLayout = true;
dlg.ShowDialog();
}
上面主要也是構(gòu)建數(shù)據(jù)源毕莱,指定報表路徑和布局朋截,然后綁定報表展示模塊窗口即可部服。
下面附上幾個系統(tǒng)功能截圖廓八,供參考學習。
1)主界面列表瘫想,基于GridControl的展示仗阅,并增加統(tǒng)計欄目。
2)歷史記錄報表展示(XtraReport報表)
3)兩種不同格式的派車單報表展示(RDLC報表)国夜。
3减噪、XtraReport報表和RDLC報的差異
這兩者的報表都能實現(xiàn)相似的效果,不過XtraReport是把它集成到DLL里面车吹,類似編譯的窗體文件一樣了筹裕;而RDLC報表本身是一個獨立的文件,我們發(fā)布的時候窄驹,要把它帶上朝卒,但是又有較好的通用性。
對于XtraReport的字段內(nèi)容展示,默認就是調(diào)用了ToString()的函數(shù)處理伤疙,因此類似日期、枚舉類型,都不需要怎么樣設置今布,就可以正常顯示,但是RDLC報表設計里面傅蹂,我們需要為每種字段設置好對應的格式氓轰,枚舉類型好像解析還是會轉(zhuǎn)換為整形,因此需要在數(shù)據(jù)源級別進行轉(zhuǎn)換时捌,否則顯示不出來拿诸。
對于自定義函數(shù)方面,XtraReport提供了較好的設計界面蚀同,能夠很大程度減少出錯的機會;RDLC則提供了彈性化的操作,提供了很多函數(shù)進行參考卦睹,需要自己添加表達式,不過在編譯的時候垃环,能夠檢查出現(xiàn)的錯誤劲赠。
如果需要動態(tài)配置、加載或者開發(fā)一些新的報表展示,可能相對來說,RDLC更方便待逞,可以增量發(fā)布一些報表震束,然后在后臺配置即可展示,不需要改動源碼編譯拓诸。