本發明涉及報表處理技術領域,特別涉及一種使用wpf界面生成報表的方法及報表引擎。
背景技術:
在wpf程序中,常常有生成大量格式不同報表的應用場景。當前wpf程序生成報表的常用方法有兩種:一種是將數據導出到excel中生成報表;另一種是使用第三方控件生成報表。
將數據導出到excel中生成報表,優點是可以方便的修改報表,但是缺點是修改的數據不能保存到數據庫中,導致修改的報表和數據庫中的數據不匹配,另外自己修改報表,報表統計數據有可能計算錯誤。
使用第三方控件生成報表的優點為打印報表嚴格按照程序設定打印,但是缺點是第三方控件編輯功能薄弱,無法實現報表修改的“所見即所得”,當報表不符合要求時,需要返回到修改頁面重新修改;另一個缺點是數據庫中保存的是報表中每個字段的數據,報表的樣式不能保存。當軟件中的報表模板發生變化時,軟件中再次打印的報表樣式可能與原有樣式不同。
技術實現要素:
為了克服現有技術的不足,本發明提供一種使用wpf界面生成報表的方法及報表引擎,抽象了報表和報表管理的常用操作,wpf作為界面的軟件項目使用該方法和引擎創建報表,可實現報表創建和修改“所見即所得”的設計效果,并且實現報表創建、加載、編輯、打印、統計等功能更加簡單快速。
為了達到上述目的,本發明采用以下技術方案實現:
一種使用wpf界面生成報表的報表引擎,報表引擎的結構包括報表模板基類、報表管理模塊兩個類。
其中,所述的報表模板基類繼承于system.windows.controls.usercontrol類,抽象了報表模板的公共方法,所有報表模板都繼承于報表模板基類。公共方法包括:初次加載操作,加載操作,驗證操作,統計操作,查找操作,獲取打印報表對象操作。
所述的報表模板是指創建具體報表對象的報表類,報表模板針對各個不同報表實現報表特有的樣式、操作,報表模板需要繼承報表模板基類后單獨實現,并根據實際需求重寫基類的公有方法。
報表模板基類中的“初次加載操作”,“加載操作”,“驗證操作”,“統計操作”四個方法均為虛方法并且方法體為空方法體,主要由繼承基類的實現類根據具體需求重寫方法;“初次加載操作”用于報表內容填寫初始化提示操作,僅在第一次新建報表時,由報表管理模塊調用;“加載操作”用于加載報表時的內容初始化操作,每次加載報表都由報表管理模塊調用;“驗證操作”用于判斷報表填寫內容是否符合報表填寫規范;“統計操作”用于統計和分析填寫的報表內容,并將統計分析結果顯示在報表上或者傳遞給報表管理模塊。
所述的報表模板基類中的“查找操作”是虛方法,用于通過報表模板中的wpf元素tag標簽查找指定wpf控件,該方法可以由子類重寫,但是該方法的方法體中提供了一個默認的實現算法,該實現算法為一個遞歸查找算法,實現步驟如下:
1)設置要查找的wpf元素控件c為空值;
2)查找指定wpf元素控件的tag標簽,如果tag值為指定的值,則將該控件賦值給c,查找結束;
3)否則判斷該wpf元素控件是否為容器,如果為容器,則遍歷容器內的子控件,對每一個子控件調用“查找操作”,如果查找結果不為空,將子控件的結果賦值給c;如果不是容器,則查找結束;
4)返回要查找的wpf元素控件。
所述的報表模板基類中的“獲取打印報表對象操作”是一個虛方法,用于克隆報表,并將報表中不符合打印要求的控件按照某種格式替換為符合打印要求的控件,該方法可以由子類重寫,但是基類中提供了一種默認的實現算法,默認實現算法步驟如下:
1)使用system.windows.markup命名空間中的xamlreader類、xamlwriter類和xamldesignerserializationmanager類的將報表序列化,再反序列化,完成報表的克隆;
2)遞歸遍歷報表中的所有控件,如果控件是datepicker,提取其中的日期,并使用textblock替換;如果控件是checkbox和radiobutton,選項使用textblock替換,并在選中項前面加符號“√”;如果控件是combobox,將選中的選項用textblock替換;如果控件是button,則隱藏控件。
其中,所述的報表管理模塊,定義了針對常用的報表功能抽象出四種基本操作,包括:新建報表,加載報表,序列化報表,打印報表。這四項操作的操作對象都是報表模板基類的對象,報表模板的對象在上轉型為報表模板基類對象后,實現操作的多態。
所述的報表管理模塊中“新建報表”的實現步驟如下:
1)根據希望創建的報表,查找對應的報表模板的定義類型;
2)利用.net中的類型反射技術創建指定定義類型報表類的報表對象;
3)清空用于顯示報表的報表容器,并將報表對象添加到容器中,用于顯示;
4)調用報表對象的“初次加載操作”;
5)調用報表對象的“加載操作”;
6)調用報表對象的“驗證操作”,判斷報表內容是否填寫正確;
7)如果報表內容填寫正確,調用報表對象的“統計操作”,否則不進行統計操作。
所述的報表管理模塊中“加載報表”的實現步驟如下:
1)讀取指定報表序列化后的xaml文件;
2)利用system.windows.markup.xamlreader類解析xaml文件,并反序列化為報表類型的對象;
3)清空用于顯示報表的報表容器,并將報表對象添加到容器中,用于顯示;
4)調用報表對象的“加載操作”;
5)調用報表對象的“驗證操作”,判斷報表內容是否填寫正確;
6)如果報表內容是否填寫正確,調用報表對象的“統計操作”,否則不進行統計操作。
所述的報表管理模塊中“序列化報表”的實現步驟如下:
1)獲取需要序列化的報表對象;
2)調用報表對象的“驗證操作”驗證報表內容是否規范,如果規范繼續執行下一步驟,否則返回內容不規范原因,序列化方法結束;
3)調用報表對象的“統計操作”;
4)使用system.windows.markup命名空間中的xamlwriter類和xamldesignerserializationmanager類的對象,將報表對象序列化為xaml類型的字符串;
5)返回xaml類型的字符串給調用方法的用戶。
所述的報表管理模塊中“打印報表”的實現步驟如下:
1)獲取需要打印的報表對象;
2)調用報表對象的“驗證操作”驗證報表內容是否規范如果規范繼續執行下一步驟,否則返回內容不規范原因,打印方法結束;
3)調用報表對象的“統計操作”;
4)調用報表對象的“獲取打印報表對象操作”獲得原報表對象的可打印對象;
5)調用命名空間system.windows.controls中的printdialog類的對象顯示打印對話框;如果調用成功,繼續下一步驟,否則拋出打印異常,方法結束;
6)調用system.windows.xps.serialization.xpsserializationmanager類型對象的saveasxaml方法,將可打印對象轉為xpsdocument類型對象;
7)使用命名空間system.windows.xps.packaging中的ixpsfixeddocumentsequencereader類型的對象和xamlreader類型的對象,將xpsdocument類型對象轉為flowdocument類型對象;
8)調用flowdocument類型對象的documentpaginator屬性獲取內容分頁對象,將內容分頁對象傳遞給printdialog類對象的printdocument方法,執行打印操作。
利用所述的報表引擎的一種使用wpf界面生成報表模板的方法步驟如下:
1)在代碼集成開發環境中創建usercontrol類型的類,并將基類改為報表模板基類,該類即為報表模板類;
2)根據報表的需求,在報表模板類中,利用xaml或wpf控件對象實現報表樣式;
3)根據報表需求,選擇報表模板基類中的虛方法重寫。
當應用程序需要生成報表時,將報表模板類傳遞給報表管理模塊類對象,由報表管理模塊類對象負責完成報表的各項操作。
與現有技術相比,本發明的有益效果是:
1、本發明提出的方法將wpf界面作為報表新建、加載、編輯、保存和打印的統一界面,實現了報表“所見即所得”的設計效果。
2、本發明提出的方法抽象了報表和報表管理的主要操作,開發人員使用本發明,可以規范報表開發流程,實現報表應用的快速開發。
3、本發明提出的方法使用wpf界面作為報表的布局模板,可以使用豐富的wpf布局控件,不僅方便了用戶的操作,而且方便開發人員對報表進行樣式布局及統計、校驗等控制操作,降低了開發人員的學習門檻。
4、本發明提出的方法,報表保存時,不僅保存了報表的主要數據,還可以保存xaml文件,即報表的布局樣式,當報表布局模板改變后,原有的報表布局樣式不會改變,實現了報表數據和報表樣式的完全保存。
5、本發明報表保存后的序列化文件為xml文件,具有跨平臺跨系統的特性,方便系統的擴展和數據的交換。
附圖說明
圖1是本發明的報表引擎類圖;
圖2是本發明的查找操作流程圖;
圖3是本發明的獲取打印報表對象操作流程圖;
圖4是本發明的新建報表流程圖;
圖5是本發明的加載報表流程圖;
圖6是本發明的序列化報表流程圖;
圖7是本發明的打印報表流程圖;
圖8是本發明的使用wpf界面生成報表模板的方法流程圖;
圖9是本發明的具體實施例效果“施工單位自評表”。
具體實施方式
以下結合附圖對本發明提供的具體實施方式進行詳細說明。
如圖1所示,一種使用wpf界面生成報表的報表引擎,報表引擎的結構包括報表模板基類、報表管理模塊兩個類。
其中,所述的報表模板基類繼承于system.windows.controls.usercontrol類,抽象了報表模板的公共方法,所有報表模板都繼承于報表模板基類。公共方法包括:初次加載操作,加載操作,驗證操作,統計操作,查找操作,獲取打印報表對象操作。
所述的報表模板是指實現具體報表的報表類,報表模板針對各個不同報表實現報表特有的樣式、操作,報表模板需要繼承報表模板基類后單獨實現,并可以根據實際需求重寫基類的公有方法。
報表模板基類中的“初次加載操作”,“加載操作”,“驗證操作”,“統計操作”四個方法均為虛方法,主要由繼承基類的實現類根據具體需求重寫方法,基類的方法體為空方法體;“初次加載操作”用于報表內容填寫初始化提示操作,僅在第一次新建報表時,由報表管理模塊調用;“加載操作”用于加載報表時的內容初始化操作,每次加載報表都由報表管理模塊調用;“驗證操作”用于判斷報表填寫內容是否符合報表填寫規范;“統計操作”用于統計和分析填寫的報表內容,并將統計分析結果顯示在報表上或者傳遞給報表管理模塊。
如圖2所示,所述的報表模板基類中的“查找操作”是虛方法,用于通過報表模板中的wpf元素tag標簽查找指定wpf控件,該方法可以由子類重寫,但是該方法的方法體中提供了一個默認的實現算法,該實現算法為一個遞歸查找算法,實現步驟如下:
1)設置要查找的wpf元素控件c為空值;
2)查找指定wpf元素控件的tag標簽,如果tag值為指定的值,則將該控件賦值給c,查找結束;
3)否則判斷該wpf元素控件是否為容器,如果為容器,則遍歷容器內的子控件,對每一個子控件調用“查找操作”,如果查找結果不為空,將子控件的結果賦值給c;如果不是容器,則查找結束;
4)返回要查找的wpf元素控件。
如圖3所示,所述的報表模板基類中的“獲取打印報表對象操作”是一個虛方法,用于克隆報表,并將報表中不符合打印要求的控件按照某種格式替換為符合打印要求的控件,該方法可以由子類重寫,但是基類中提供了一種默認的操作方法,默認操作步驟如下:
1)使用system.windows.markup命名空間中的xamlreader類、xamlwriter類和xamldesignerserializationmanager類的將報表序列化,再反序列化,完成報表的克隆;
2)遞歸遍歷報表中的所有控件,如果控件是datepicker,提取其中的日期,并使用textblock替換;如果控件是checkbox和radiobutton,選項使用textblock替換,并在選中項前面加符號“√”;如果控件是combobox,將選中的選項用textblock替換;如果控件是button,則隱藏控件。
其中,所述的報表管理模塊,定義了針對常用的報表功能抽象出四種基本操作,包括:新建報表,加載報表,序列化報表,打印報表。這四項操作的操作對象都是報表模板基類的對象,報表模板對象在上轉型為報表模板基類對象后,實現操作的多態。
如圖4所示,所述的報表管理模塊中“新建報表”的實現步驟如下:
1)根據希望創建的報表,查找對應的報表模板的定義類型;
2)利用.net中的類型反射技術創建指定定義類型報表類的報表對象;
3)清空用于顯示報表的報表容器,并將報表對象添加到容器中,用于顯示;
4)調用報表對象的“初次加載操作”;
5)調用報表對象的“加載操作”;
6)調用報表對象的“驗證操作”,判斷報表內容是否填寫正確;
7)如果報表內容填寫正確,調用報表對象的“統計操作”,否則不進行統計操作。
如圖5所示,所述的報表管理模塊中“加載報表”的實現步驟如下:
1)讀取指定報表序列化后的xaml文件;
2)利用system.windows.markup.xamlreader類解析xaml文件,并反序列化為報表類型的對象;
3)清空用于顯示報表的報表容器,并將報表對象添加到容器中,用于顯示;
4)調用報表對象的“加載操作”;
5)調用報表對象的“驗證操作”,判斷報表內容是否填寫正確;
6)如果報表內容是否填寫正確,調用報表對象的“統計操作”,否則不進行統計操作。
如圖6所示,所述的報表管理模塊中“序列化報表”的實現步驟如下:
1)獲取需要序列化的報表對象;
2)調用報表對象的“驗證操作”驗證報表內容是否規范,如果規范繼續執行下一步驟,否則返回內容不規范原因,序列化方法結束;
3)調用報表對象的“統計操作”;
4)使用system.windows.markup命名空間中的xamlwriter類和xamldesignerserializationmanager類的對象,將報表對象序列化為xaml類型的字符串;
5)返回xaml類型的字符串給調用方法的用戶。
如圖7所示,所述的報表管理模塊中“打印報表”的實現步驟如下:
1)獲取需要打印的報表對象;
2)調用報表對象的“驗證操作”驗證報表內容是否規范如果規范繼續執行下一步驟,否則返回內容不規范原因,打印方法結束;
3)調用報表對象的“統計操作”;
4)調用報表對象的“獲取打印報表對象操作”獲得原報表對象的可打印對象;
5)調用命名空間system.windows.controls中的printdialog類的對象顯示打印對話框;如果調用成功,繼續下一步驟,否則拋出打印異常,方法結束;
6)調用system.windows.xps.serialization.xpsserializationmanager類型對象的saveasxaml方法,將可打印對象轉為xpsdocument類型對象;
7)使用命名空間system.windows.xps.packaging中的ixpsfixeddocumentsequencereader類型的對象和xamlreader類型的對象,將xpsdocument類型對象轉為flowdocument類型對象;
8)調用flowdocument類型對象的documentpaginator屬性獲取內容分頁對象,將內容分頁對象傳遞給printdialog類對象的printdocument方法,執行打印操作。
如圖8所示,利用所述的報表引擎的一種使用wpf界面生成報表模板類的方法步驟如下:
1)在代碼集成開發環境中創建usercontrol類型的類,并將基類改為報表模板基類,該類即為報表模板類;
2)根據報表的需求,在報表模板類中,利用xaml或wpf控件對象實現報表樣式;
3)根據報表需求,選擇報表模板基類中的虛方法重寫。
將報表模板類傳遞給報表管理模塊類對象,由報表管理模塊類對象負責完成報表的各項操作。
具體實施例1:以報表“施工單位自評表”的各項操作為例。“施工單位自評表”的界面如圖9。
新建“施工單位自評表”報表模板的步驟如下:
1)在代碼集成開發環境中創建usercontrol類型的代碼文件,并將基類改為報表模板基類。
2)根據報表的需求,實現報表樣式。報表使用grid對頁面進行切分布局,并在需要錄入信息的地方放入相應控件。如果后臺代碼需要調用該控件,在控件的tag標簽中輸入控件的標識符字符串。例如單位工程名稱、分部工程名稱放置textbox控件,工序編號放置textbox控件,標識符為“txtprocessid”,施工單位放置combobox控件,標識符為“cmbconstructionunit”,施工日期放置兩個datepicker控件,標識符分別是“dpstart”和“dpend”,代表開始和結束日期。主控項目檢驗點合格率放置textbox控件,標識符為“txtmain”,一般項目點合格率放置textbox控件,標識符為“txtcommon”。工程質量評定等級處放置textblock控件,標識符為“tblevel”。
根據報表需求,選擇基類中的虛方法重寫。重寫“初次加載操作”:使用“查找操作”查找標識符“dpstart”和“dpend”對應的控件,并把時間設置為當前時間。重寫“加載操作”:使用“查找操作”查找標識符“cmbconstructionunit”對應的combobox控件,從數據庫中找到施工單位列表,并加載到combobox控件的下拉列表中。重寫“驗證操作”:查找標識符“txtprocessid”,驗證輸入的工序編號是否是六位數字,如果驗證失敗,返回假值,并提示錯誤信息;查找標識符“txtmain”和“txtcommon”的控件,驗證輸入的文字是否為0-100以內的數字,如果驗證失敗,返回假值,并提示錯誤信息;如果驗證成功,返回真值。重寫“統計操作”:查找標識符“txtmain”和“txtcommon”的控件,并取出主要項目和一般項目的合格率,根據形參中傳遞的計算公式,計算工序質量等級。查找標識符“tblevel”,并將工序質量等級結果賦值給“tblevel”控件,將評定等級結果作為返回值返回。利用報表管理模塊類的對象實現新建“施工單位自評表”的實現步驟:
1)查找“施工單位自評表”模板的類型。
2)利用.net中的類型反射技術創建“施工單位自評表”模板的報表對象。
3)清空用于顯示報表的報表容器,并將報表對象添加到容器中,用于顯示。
4)調用報表對象的“初次加載操作”。
5)調用報表對象的“加載操作”。
6)調用報表對象的“驗證操作”,判斷報表內容是否填寫正確。由于是初次加載,報表中的數據沒有填寫,因此“驗證操作”返回值為假值。
7)如果報表內容填寫正確,調用報表對象的“統計操作”,否則不進行統計操作。
利用報表管理模塊類的對象實現施工單位自評表“加載報表”的實現步驟如下:
1)查找指定的需加載的施工單位自評表的xaml文件。
2)利用system.windows.markup.xamlreader類解析xaml文件,并反序列化為施工單位自評表模板類型的對象。
3)清空用于顯示報表的報表容器,并將報表對象添加到容器中,用于顯示。
4)調用報表對象的“加載操作”。
5)調用報表對象的“驗證操作”,判斷報表內容是否填寫正確。
6)如果報表內容是否填寫正確,調用報表對象的“統計操作”,否則不進行統計操作。
利用報表管理模塊類的對象實現施工單位自評表中“序列化報表”的實現步驟如下:
1)獲取需要施工單位自評表報表對象。
2)調用報表對象的“驗證操作”驗證報表內容是否規范,如果規范繼續執行下一步驟,否則返回內容不規范原因,序列化方法結束。
3)調用報表對象的“統計操作”,并通過返回值獲取報表的評定等級。
4)使用system.windows.markup命名空間中的xamlwriter類和xamldesignerserializationmanager類的對象,將報表對象序列化為xaml類型的字符串。
5)返回xaml類型的字符串給調用方法的用戶,完成序列化。
利用報表管理模塊類的對象實現施工單位自評表中“打印報表”的實現步驟如下:
1)獲取施工單位自評表報表對象。
2)調用報表對象的“驗證操作”驗證報表內容是否規范,如果規范繼續執行下一步驟,否則返回內容不規范原因,序列化方法結束。
3)調用報表對象的“統計操作”,計算工序質量等級。
4)調用報表對象的“獲取打印報表對象操作”獲得原報表對象的可打印對象。在“獲取打印報表對象操作”中,datepicker和combobox控件都被textblock控件代替,用于打印操作。
5)調用命名空間system.windows.controls中的printdialog類的對象顯示打印對話框。如果調用成功,繼續下一步驟,否則拋出打印異常,方法結束。
6)調用system.windows.xps.serialization.xpsserializationmanager類型對象的saveasxaml方法,將可打印對象轉為xpsdocument類型對象。
7)使用命名空間system.windows.xps.packaging中的ixpsfixeddocumentsequencereader類型的對象和xamlreader類型的對象,將xpsdocument類型對象轉為flowdocument類型對象。
8)調用flowdocument類型對象的documentpaginator屬性獲取內容分頁對象,將內容分頁對象傳遞給printdialog類對象的printdocument方法,執行打印操作。
以上實施例在以本發明技術方案為前提下進行實施,給出了詳細的實施方式和具體的操作過程,但本發明的保護范圍不限于上述的實施例。上述實施例中所用方法如無特別說明均為常規方法。