一、AspxPivotGrid控件的基礎知識
AspxPivotGrid是DXperience開發控件中的一個功能龐大的數據分析和統計控件,在應對各種名目繁多的數據透視、數據匯總、數據分析方面,有非常好的表現。其最主要的特點表現為如下幾點:
首先我們通過實際界面來認識一下ASPxPivotGrid控件,對它有一個直觀的了解,也好為后面的講述做一個鋪墊。圖1是運行界面,我們仔細觀察這幅圖:
我們這里做一個說明:
1、候選字段欄:這里列出數據源中所有可用於進行統計分析的字段,候選區內的字段,根據需要可在任何時候拖動到數據列區域或數據行區域,數據區內的數據會隨時跟着變化。
2、數據列區域:統計分析表格的列字段配置區域,用於構成表格中的列記錄(縱向顯示的數據)。
3、數據行區域:統計分析表格的行字段配置區域,用於構成表格中的行記錄(橫向顯示的數據)。
注意:通過標題按鈕可以對字段值進行排序、本地過濾等操作。
4、數據區域:統計分析表格的待統計匯總的字段配置區域,這里列出的字段,要求為可進行統計分析的數據類型,通常為數值型數據或其他可用於統計的數據類型。
5、記錄列數據匯總:用於匯總每列的數據匯總;
6、記錄行數據匯總:用於匯總每行各個數據的匯總;
7、導出工具欄:非ASPxpivotGrid控件自帶功能,需要另外處理,但導出數據功能是本控件很重要的一個功能。
8、查詢條件:用於設定待統計數據的篩選范圍。
通過這個圖,我們可以了解到從這個交叉表可以了解到PivotGridControl控件具有以下特點:
1) 可定制的報表
終端用戶能夠定制PivotGridControl的字段。在字段標題上點擊右鍵彈出字段列表框,通過鼠標拖拽增加或減少行、列、數據區域的字段,改變交叉報表的分析方式。
2) 樹形結構的字段值
圖1
的行區域有“部門、姓名”2
個字段,部門是姓名的上級字段,在部門的字段值上顯示了“展開/
折疊按鈕”。例如圖3
折疊字段值“兒科”后,數據區域的單元格將以“兒科”小計行的方式顯示。
如果有2
個以上的行(列)字段,除了最后一級,其它字段值都可以像樹形節點一樣展開/
折疊。
3) 本地過濾
界面上顯示的字段標題具有本地過濾的功能。點擊字段標題上的過濾按鈕,可以彈出字段值列表。篩選字段值后,交叉表以此為條件過濾數據源中的數據后再進行匯總。當行、列字段值較多時,終端用戶通過本地過濾減少行列數,只統計出當前關注的數據。
通過上面這些講述,我們了解了AspxPivotGrid控件的一些特點,有了一些初步的認識,下面我們來看看如何使用這個控件來設計我們的軟件。
二、AspxPivotGrid的基本用法
要使用AspxPivotGrid控件,首先要具有必要的開發環境(請見文件頭部的介紹)。我們新建一個 aspxform,然后在工具欄中的 data &analytics分組中找到 AspxPivotGrid控件,把它拖到webform上,然后點該控件右上角的設計標簽,如圖2中的標識1所示:
之后,在圖2中的標識2所示位置,指定控件所用的數據源,這里以一個Objectdatasource為例,設定為ods;
接下來,我們設置ASPxPivotGrid的字段。在圖2標識3的位置,點擊 Fields ,會看到接下來的界面,見圖3所示。
圖3標識1的位置,單擊一下即可添加一個字段。
圖3標識2的位置,設定字段在ASPxPivotGrid的位置,可選擇的包括 列(ColumnArea),行(RowArea),過濾字段(FilterArea),數據(DataArea),根據需要選擇即可;
圖3標識3的位置,設定本字段屬於哪個分組,根據需要錄入分組名稱。若沒有分組,可為空。
圖3標識4的位置,錄入字段名稱(對應數據庫中的哪個字段)。請留意此處必須與數據庫字段保持完全一致。至於ID,請設置一個完全不同於其他控件ID的值,通常我會設置為“Field”+字段名稱。
圖3標識5的位置,錄入字段的顯示標題。中文字符,這是最終用戶看到的界面名稱。
圖3標識6的位置,是當需要把該字段作為一個計算字段的時候需要設置的。即當前字段以數據庫字段為基礎進行數據計算,但並不存在於數據庫的時候方才需要如此設置。對應的還需要設置UnboundExpression、UnbountType等。
圖3中的標識位置數據都設置完成以后,我們就完成了一個字段的添加。接下來依次添加我們需要的所有字段即可。所有字段都添加完成后,點擊ok 按鈕,就回到之前的設計界面。
查看webform對應的aspx文件源碼,我們會看到下面這樣的代碼,請看圖4.
圖4中的代碼,我們可以發現是很有規律的。上面我們寫了那么多步驟做了那么多工作,無非就是生成了這些代碼,增加了 一些 Fields,並根據需要設定了每個Field的一些屬性。所以、朋友們不免要想:是不是可以用代碼完成上面這些工作呢?答案當然是肯定的。后面我們會給 出方法。
查閱DevExpress的在線文檔,不難發現ASPxpivotGrid控件實現了一個把數據導出的功能,其中提供了一個組件:ASPxPivotGridExporter,這就是ASPxpivotGrid控件導出數據的關鍵所在,它提供了如下幾個方法:
ASPxPivotGridExporter1.ExportPdfToResponse(fileName, saveAs);
ASPxPivotGridExporter1.ExportXlsToResponse(fileName, saveAs);
ASPxPivotGridExporter1.ExportMhtToResponse(fileName,
"utf-8"
,
"ASPxPivotGridPrinting Sample"
,
true
,saveAs);
ASPxPivotGridExporter1.ExportRtfToResponse(fileName, saveAs);
ASPxPivotGridExporter1.ExportTextToResponse(fileName,saveAs);
ASPxPivotGridExporter1.ExportHtmlToResponse(fileName, "utf-8", "ASPxPivotGridPrinting Sample", true,saveAs);
我們在工具欄中找到這個組件,把它拖到aspxform中去,然后增加一個ASPxCombobox和兩個按鈕,如下圖所示:
file:///C:/Users/Temp/msohtmlclip1/01/clip_image010.jpg
雙擊保存按鈕,在Click事件中寫下如下的代碼:
protected
void
ASPxMenu2_ItemClick(
object
source,DevExpress.Web.ASPxMenu.
MenuItemEventArgs
e)
{
string
s =e.Item.Name.ToString();
string
sFormat= mycbFormat.Text.ToString();
if
(s ==
"pivotSave"
)
{
Export(
true
,sFormat);
}
if
(s ==
"pivotOpen"
)
{
Export(
false
,sFormat);
}
}
void
Export(
bool
saveAs,
string
sFormat)
{
string
fileName =
"PivotGrid"
;
switch
(sFormat)
{
case
"pdf"
:
ASPxPivotGridExporter1.ExportPdfToResponse(fileName, saveAs);
break
;
case
"Excel"
:
ASPxPivotGridExporter1.ExportXlsToResponse(fileName, saveAs);
break
;
case
"Mht"
:
ASPxPivotGridExporter1.ExportMhtToResponse(fileName,
"utf-8"
,
"ASPxPivotGridPrinting Sample"
,
true
,saveAs);
break
;
case
"Rtf"
:
ASPxPivotGridExporter1.ExportRtfToResponse(fileName, saveAs);
break
;
case
"Text"
:
ASPxPivotGridExporter1.ExportTextToResponse(fileName, saveAs);
break
;
case
"Html"
:
ASPxPivotGridExporter1.ExportHtmlToResponse(fileName,
"utf-8"
,
"ASPxPivotGridPrinting Sample"
,
true
,saveAs);
break
;
}
}
這樣便實現了根據最終用戶選擇的文件類型,導出ASPxpivotGrid數據到本地文件的功能。這樣就極大方便了最終用戶的使用,為用戶進一步組織數據進行其他處理提供了便利。
三、AspxPivotGrid的高級用法
ASPxPivotGrid 是功能強大的,但設置字段的過程也是極其繁瑣枯燥的。通過跟蹤分析,我們發現設計器中的過程,其實只是在aspx文件中增加了fields一節,設置了每 個field的相關屬性。那么,我們自然可以通過代碼來實現相同的工作,從而一勞永逸,避免每次都去手工在設計器中設置字段了。
經比對,我們發現對於每個field,都需要設置如下幾個屬性:
Area :可選擇的項目:RowArea,ColumnArea,DataArea,FilterArea; 含義為:字段所處的區域。
FieldName:字段名稱,對應數據庫的字段名;
Caption:字段標題;
AreaIndex:字段在當前區域的序號(第幾位顯示);
ID:當前字段的標識符號;
FormatType:格式化類型;數值、日期、字符串等;
FormatString:格式化字符串;
有了這幾個基本屬性,我們就可以用代碼來綁定數據庫的字段到ASPxpivotGrid控件中了。於是我們不難寫出下面這樣的代碼:
foreach
(ZiyuWeb.Entity.
Sys_UIConfig
item
in
sConfigs)
{
switch
(item.pFieldArea)
{
case
"RowArea"
:
{
DevExpress.Web.ASPxPivotGrid.
PivotGridField
myField=
new
DevExpress.Web.ASPxPivotGrid.
PivotGridField
();
myField.Area =DevExpress.XtraPivotGrid.
PivotArea
.RowArea;
myField.FieldName =item.FieldName;
myField.Caption =item.FieldDescribe;
myField.AreaIndex =item.pAreaIndex;
myField.ID =
"field"
+ item.FieldName;
myGrid.Fields.Add(myField);
if
(item.DispFormat !=
null
)
{
if
(item.DispFormat.Contains(
"yy"
))
{
myGrid.Fields[item.FieldName].ValueFormat.FormatType = DevExpress.Utils.
FormatType
.DateTime;
myGrid.Fields[item.FieldName].ValueFormat.FormatString =
"yyyy-MM-dd"
;
//item.DispFormat;
myGrid.Fields[item.FieldName].CellFormat.FormatType = DevExpress.Utils.
FormatType
.DateTime;
myGrid.Fields[item.FieldName].CellFormat.FormatString =
"yyyy-MM-dd"
;
//item.DispFormat;
}
}
break
;
}
case
"ColumnArea"
:
{
DevExpress.Web.ASPxPivotGrid.
PivotGridField
myField =
new
DevExpress.Web.ASPxPivotGrid.
PivotGridField
();
myField.Area =DevExpress.XtraPivotGrid.
PivotArea
.ColumnArea;
myField.FieldName =item.FieldName;
myField.Caption =item.FieldDescribe;
myField.AreaIndex =item.pAreaIndex;
myField.ID =
"field"
+ item.FieldName;
myGrid.Fields.Add(myField);
break
;
}
case
"DataArea"
:
{
DevExpress.Web.ASPxPivotGrid.
PivotGridField
myField =
new
DevExpress.Web.ASPxPivotGrid.
PivotGridField
();
myField.Area =DevExpress.XtraPivotGrid.
PivotArea
.DataArea;
myField.FieldName = item.FieldName;
myField.Caption =item.FieldDescribe;
myField.AreaIndex =item.pAreaIndex;
myField.ID =
"field"
+ item.FieldName;
myGrid.Fields.Add(myField);
break
;
}
case
"FilterArea"
:
default
:
{
DevExpress.Web.ASPxPivotGrid.
PivotGridField
myField =
new
DevExpress.Web.ASPxPivotGrid.
PivotGridField
();
myField.Area =DevExpress.XtraPivotGrid.
PivotArea
.FilterArea;
myField.FieldName =item.FieldName;
myField.Caption =item.FieldDescribe;
myField.AreaIndex =item.pAreaIndex;
myField.ID =
"field"
+ item.FieldName;
myGrid.Fields.Add(myField);
break
;
}
}
}
好了,這樣我們就已經完成了綁定數據字段到ASPxpivotGrid控件的工作。接下來我們看看如何設置計算列到控件中去。
要設置計算列,就不得不留意如下幾個屬性:
UnboundFieldName:未綁定字段名稱;
UnboundType:未綁定字段的數據類型,包括字符型,object、日期型、數值型。
UnboundExpression:計算列的計算表達式,可用的表達式種類很多,請大家查閱Devexpress的在線文檔。
TopValueShowOthers:是否顯示其他數據;
RunningTotal:是否統計;
TopValueType:統計類別,包括最大值、最小值、求和、平均值等等;
Caption:計算列的標題;
Area:計算列所處的位置:可選擇的項目:RowArea,ColumnArea,DataArea,FilterArea;
ID:當前字段的標識符號;
FormatType:格式化類型;數值、日期、字符串等;
FormatString:格式化字符串;
有了這幾個屬性,自然我們能寫出下面這樣的代碼,用於自動添加計算列到ASPxpivotGrid控件中去。
///
<summary>
///
PivotGrid
增加計算列
///
</summary>
///
<param name="sFieldCaption">
計算列的顯示名稱
</param>
///
<param name="sBaseFieldName">
計算列基礎列字段名稱(基於哪個字段計算?若是多個字段計算則為string.Empty 即可)
</param>
///
<param name="sComputeExpresion">
計算列的計算表達式例如 "[gg]*[length]/1000"
</param>
///
<param name="myGrid">
PivotGrid
控件
</param>
///
<param name="mySummarytype">
統計類型
</param>
public
static
void
addComputeField(
string
sFieldCaption,
string
sBaseFieldName,
string
sComputeExpresion, DevExpress.Web.ASPxPivotGrid.
ASPxPivotGrid
myGrid,
DevExpress.Data.PivotGrid.
PivotSummaryType
mySummarytype)
{
DevExpress.Web.ASPxPivotGrid.
PivotGridField
myFieldCP =
new
DevExpress.Web.ASPxPivotGrid.
PivotGridField
();
myFieldCP.Area =DevExpress.XtraPivotGrid.
PivotArea
.DataArea;
myFieldCP.Caption = sFieldCaption;
myFieldCP.ID =
"Field_"
+sFieldCaption;
myFieldCP.TopValueShowOthers=
true
;
myFieldCP.RunningTotal =
true
;
myFieldCP.TopValueType =
PivotTopValueType
.Sum;
myFieldCP.SummaryType=mySummarytype;
if
(sBaseFieldName !=
string
.Empty)
myFieldCP.FieldName =sBaseFieldName;
myFieldCP.UnboundType =DevExpress.Data.
UnboundColumnType
.Object;
myFieldCP.UnboundExpression =sComputeExpresion;
myGrid.Fields.Add(myFieldCP);
}
有了這些代碼,我們日后需要用到ASPxpivotGrid控件來統計分析數據的時候,只需要簡單的寫下兩行代碼即可:
ZiyuWeb.WebFunc.ZiyuDevAspxPivotGridHelper.ConfigPivotGrid("hzsendtotal", true, "sendate", ASPxPivotGrid1, true, "chart");//配置ASPxPivotGrid控件;
//下面兩行代碼是增加計算列的,如不需要,則保持原樣,否則打開注釋並根據需要調整代碼即可;
// ZiyuWeb.WebFunc.ZiyuDevAspxPivotGridHelper.addComputeField("面 積",string.Empty, "[gg]*[length]/1000", ASPxPivotGrid1,DevExpress.Data.PivotGrid.PivotSummaryType.Sum);
完整的代碼和界面,請讀者朋友們查看本文的示例項目。
在實際使用過程中,我們發現,ASPxpivotGrid控件,在面對大批量數據進行統計分析的時候,頁面打開會比較慢,甚至會失去響應,這便有了一個問題:如何提高它的運行效率呢?
四、提高AspxPivotGrid的運行效率
ASPxPivotGrid 組件是一個基於ASP.NET平台下的全面的數據分析、數據挖掘、和可視化報表的解決方案。它的出現不僅可以為新的解決方案去除數據分析方面的種種缺陷, 也可以從根本上改善已有的大型數據分析軟件在最終數據呈現上的不足,從而讓你的最終用戶能更好獲取和分析相關數據。那么如何進一步提高 ASPxPivotGrid的性能,對數據進行高效切分,從而為客戶提供一個非常直觀的終端用戶體驗呢?這里我們從兩方面來說明問題。
A、選擇一個合適的數據源
我 們說並不是所有的數據源都符合你的程序。如果你每次訪問的數據量在150,000以下的話,你最好使用SqlSever數據庫,如果數據量超過 150,000行的話,你將考慮使用Analysis Services 即分析數據庫,否則運行速度會很慢。當然如果你選擇一個好的數據庫服務器,那可以大於上面的數據,反之如果使用xml或者MS Access數據存儲格式就可能更少了。
那么如何選擇一個合適的數據庫呢?首先,你需要估計一下你的數 據量,PivotGrid每次發送請求的一個數據量。如果你不知道實際的記錄數,你可以根據列的成員特性推測出來。例如,你有7列:產品種類(50), 產品子類別(1000), 產品 (50000),國家 (10),省(400), 市 (10000), 顧客 (50000),這里括號中的數字是對應成員特有的記錄數。我們分析一下,上面“產品種類, 產品子類別,國家,省和市”其實根本就沒有提供新的度量數據,“產品種類”和“產品子類別”其實是包含在“產品”中,而“國家,省和市”所產生的度量數據 則體現在“顧客”信息記錄中。因此我們很快就能通過“產品”和“顧客”的乘積得出記錄數(50000 * 50000 = 2500 000)
B、性能優化以及對比
我們在選擇了不同的數據庫后,又該怎么提高PivotGrid的性能呢?
當 你使用SQL Server作為PivotGrid的數據源的話,總體性能大概由加載數據的時間、計算的時間、數據繪制時間三部分組成。為了提高數據加載時間,你可以在 數據服務器和Web服務器之間建立更好的連接,數據庫服務器和Web服務器最好是使用同一台機器,調整數據服務器,以實現最佳的性能和緩存數據的檢索。此 外我們還可以在服務端優化查詢語句,比如"selectCategory, Product, Sales from Sales" 查詢改為 "select Category, Product, sum(Sales) from Salesgroup by Category, Product".這樣很大程度上能減少PivotGrid本身計算的時間。
當你使用分析服務器作為數 據源的話,對於每次請求它是不存在重載和重新計算數據的。它的數據和計算結果都是作為緩存,返回的僅僅是你請求的那部分數據。盡管這樣,如果是小規模的查 詢那速度還是低於SQL Server,但在大型數據集上它將產生更好的效果。事實上,如果沒有使用Analysis Services的數據源,對於上百萬條的數據我想你是很難得到滿意結果的。
頁面來源: