轉(zhuǎn)帖|其它|編輯:郝浩|2010-12-22 17:26:42.000|閱讀 1638 次
概述:Silverlight中常常用到DataGrid來展示密集數(shù)據(jù). 而常見應(yīng)用系統(tǒng)中我們需要把這些數(shù)據(jù)導(dǎo)入導(dǎo)出到固定Office套件中例如常用的Excel表格. 那么在Silverlight 中如何加以實(shí)現(xiàn)?
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Silverlight中常常用到DataGrid來展示密集數(shù)據(jù). 而常見應(yīng)用系統(tǒng)中我們需要把這些數(shù)據(jù)導(dǎo)入導(dǎo)出到固定Office套件中例如常用的Excel表格. 那么在Silverlight 中如何加以實(shí)現(xiàn)?
在參考大量資料后 提供參考思路如下:
A:純客戶端導(dǎo)出處理.利用Silverlight 與Javascript 進(jìn)行交互實(shí)現(xiàn)導(dǎo)出Excel.
B:服務(wù)器端導(dǎo)出.獲得DataGrid數(shù)據(jù)源. 傳遞給WCF Service到服務(wù)器端. 然后把傳回?cái)?shù)據(jù)通過Asp.net中通用處理導(dǎo)出Excel方法加以實(shí)現(xiàn).
方法A實(shí)現(xiàn)導(dǎo)入導(dǎo)出核心在JS腳本中. 屬于純客戶端交互. 簡潔實(shí)用. 但問題也正是源自于JS腳本. 如果對(duì)Excel數(shù)據(jù)格式進(jìn)行變動(dòng). 大家都應(yīng)該知道JS支持的調(diào)試時(shí)不容易控制的. 所以很容易出現(xiàn)腳本錯(cuò)誤. 而且每次修改起來都很麻煩費(fèi)時(shí).
方法B也算是各位非常熟悉一種方式. 獲得數(shù)據(jù)把數(shù)據(jù)傳入Asp.net中通用實(shí)現(xiàn)導(dǎo)出Excel方法. 加以實(shí)現(xiàn). 大部分編碼都在服務(wù)器端. 比JS要容易控制. 所以方法B相比方法A而要效率更高, 且更容易移植 修改控制.
Silverlight中有沒有其他方式來實(shí)現(xiàn)? 答案是有的.Silverlight當(dāng)在使用高級(jí)權(quán)限運(yùn)行Out-Of-Broswer[OOB]瀏覽器外應(yīng)用時(shí). Silverlight 4版本中微軟為了支持企業(yè)用戶提供類似Office自動(dòng)化功能,引入Com+自動(dòng)化. COM+自動(dòng)化僅支持有高級(jí)信任許可的OOB Silverlight應(yīng)用,高級(jí)信任許可意味著操作者可以在少許限制的條件下,在Windows計(jì)算機(jī)上執(zhí)行幾乎所有的命令,這就對(duì)Silverlight 實(shí)現(xiàn)Excel導(dǎo)出提供了可能.
注意:當(dāng)直接點(diǎn)擊導(dǎo)出按鈕時(shí).會(huì)提示異常:"當(dāng)前上下文不支持此操作."因使用Com+自動(dòng)化需要在OOB應(yīng)用模式才具有權(quán)限操作.所以右鍵點(diǎn)擊程序選擇程序安裝:
安裝本地后.自動(dòng)打開:
點(diǎn)擊導(dǎo)出到Excel按鈕 導(dǎo)出效果[有點(diǎn)粗糙].:
A:如何實(shí)現(xiàn)
頁面XAML布局:為了演示目的只有個(gè)Datagrid和一個(gè)Button按鈕如下.
1 <Grid x:Name="LayoutRoot" Background="White" Height="500" Width="707">
2 <sdk:DataGrid AutoGenerateColumns="False" Margin="24,61,191,207" Name="dataGrid1">
3 <sdk:DataGrid.Columns >
4 <sdk:DataGridTextColumn Header="編 號(hào)" Binding="{Binding Id}"></sdk:DataGridTextColumn>
5 <sdk:DataGridTextColumn Header="顧客姓名" Binding="{Binding CustomerName}"></sdk:DataGridTextColumn>
6 <sdk:DataGridTextColumn Header="地 址" Binding="{Binding Address}"></sdk:DataGridTextColumn>
7 <sdk:DataGridTextColumn Header="電話號(hào)碼" Binding="{Binding Telephone}"></sdk:DataGridTextColumn>
8 </sdk:DataGrid.Columns>
9 </sdk:DataGrid>
10 <Button Content="導(dǎo)出到Excel中" Background="Red" Height="34" Margin="24,21,550,445" Name="button1" Width="133" Click="button1_Click" />
11 </Grid>
DataGrid數(shù)據(jù)綁定. 一個(gè)Customer類提供一個(gè)List集合實(shí)現(xiàn)簡單數(shù)據(jù)源:
1 public class Customer
2 {
3 public int Id { get; set; }
4 public string CustomerName { get; set; }
5 public string Address { get; set; }
6 public string Telephone { get; set; }
7
8 /// <summary>
9 /// 獲取一個(gè)批量數(shù)據(jù)用來綁定DataGrid中 演示由DataGrid 導(dǎo)出到數(shù)據(jù)庫中
10 /// Author:chenkai Date:2010年6月9日16:25:25
11 /// </summary>
12 public static List<Customer> GetCustomerListBind()
13 {
14 List<Customer> getcuslist = new List<Customer>();
15
16 Random getdom = new Random();
17
18 for (int count = 0; count < 12; count++)
19 {
20 getcuslist.Add(new Customer { Id=count, CustomerName=count.ToString()+"陳凱", Address=getdom.Next(15,200).ToString()+"中國", Telephone=getdom.Next(0,230000).ToString()});
21 }
22 return getcuslist;
23 }
24
25 }
后臺(tái)操作演示:
代碼:
1 public partial class MainPage : UserControl
2 {
3 public MainPage()
4 {
5 InitializeComponent();
6
7 //綁定數(shù)據(jù)
8 List<Customer> getcuslist = Customer.GetCustomerListBind();
9 if (getcuslist.Count > 0)
10 {
11 this.dataGrid1.ItemsSource = getcuslist;
12 }
13
14 //綁定Button事件
15 this.button1.Click += new RoutedEventHandler(ExpertDataToExcel);
16 }
17
18 void ExpertDataToExcel(object sender, RoutedEventArgs e)
19 {
20 int rowIndex = 1;
21 int coulmnIndex = 1;
22
23 try
24 {
25 dynamic excel = AutomationFactory.CreateObject("Excel.Application");
26
27 excel.workbooks.Add();
28
29 dynamic sheet = excel.ActiveSheet;
30
31 //加載Excel表頭數(shù)據(jù)
32 for (int i = 0; i < this.dataGrid1.Columns.Count; ++i)
33 {
34 dynamic headerCell = sheet.Cells[rowIndex, coulmnIndex + i];
35 //把當(dāng)前Grid中表頭信息賦值給Excel表頭.
36 headerCell.Value = this.dataGrid1.Columns[i].Header;
37 headerCell.Font.Bold = true;//加粗
38 headerCell.Interior.Color = 0xFF00;//設(shè)置背景顏色
39 }
40
41 //加載展示數(shù)據(jù)
42 foreach (Customer customer in this.dataGrid1.ItemsSource)
43 {
44 rowIndex++;
45
46 //column 1
47 dynamic cellFirstName = sheet.Cells[rowIndex, 1];
48 cellFirstName.Value = customer.Id;
49 cellFirstName.Font.Color = 003399;
50
51 //column 2
52 dynamic cellLastName = sheet.Cells[rowIndex, 2];
53 cellLastName.Value = customer.CustomerName;
54 cellLastName.Font.Color = 003399;
55
56 //column 3
57 dynamic cellAge = sheet.Cells[rowIndex, 3];
58 cellAge.Value = customer.Address;
59 cellAge.Font.Color = 003399;
60
61 //column 4
62 dynamic cellSubscribed = sheet.Cells[rowIndex, 4];
63 cellSubscribed.Value = customer.Telephone;
64 cellSubscribed.Font.Color = 003399;
65 }
66 excel.Visible = true;
67
68 MessageBox.Show("導(dǎo)出成功Excel中!");
69 }
70 catch (Exception ex)
71 {
72 MessageBox.Show("Error generating excel: " + ex.Message);
73 }
74 }
75 }
如上已經(jīng)實(shí)現(xiàn)導(dǎo)出Excel功能. 但不要忘了設(shè)置Silverlight Application 支持OOB.選擇Silverlight項(xiàng)目屬性. 在屬性Silverlight分欄設(shè)置:OOB可用
右鍵菜單可見Install Menu選項(xiàng):
如上即簡單實(shí)現(xiàn)Silverlight直接從DataGrid導(dǎo)出Excel表格效果. 仔細(xì)分析一下后臺(tái)代碼: 應(yīng)該發(fā)現(xiàn)我使用Silverlight 4和.NET 4版本共有的一個(gè)新特性dynamic object.
在Silverlight 4 和.NEt 4引入Dynamic關(guān)鍵字.讓我們可以在不引用MS Office DllS情況下直接操作使用MS Office Com.在.NET 4中創(chuàng)建一個(gè)Excel Document如下編碼:
1 dynamic excel = Microsoft.VisualBasic.Interaction.CreateObject("Excel.Application", string.Empty);
在Silverlight 4中:
1 dynamic excel = AutomationFactory.CreateObject("Excel.Application");
如上使用Dynamic關(guān)鍵必須引用空間InteropServices: 至于關(guān)于空間結(jié)構(gòu)和使用方法可以參見MSDN
1 using System.Runtime.InteropServices.Automation;
2 using System.Runtime.InteropServices
對(duì)于Dynamic關(guān)鍵字現(xiàn)在在.NET去年還是Beta版本很多人對(duì)此有些微詞,依然還處在一個(gè)爭論之中.
Dynamic編碼時(shí)沒有智能提示, 無法再編譯時(shí)做靜態(tài)類型檢查等.這對(duì)于使用慣了.NET 確實(shí)讓我感到很不舒服. 不過在使用Dynamic時(shí)最想讓我想到.NET 3.5版本中Var,
當(dāng)var在C#3.0中剛剛出現(xiàn)的時(shí)候就引起了一些人的質(zhì)疑,后來微軟解釋var只是隱含類型聲明符,并且只能用作局部變量,它其實(shí)仍然是強(qiáng)類型,只不過是編譯器由初始化結(jié)果推斷而來,所以對(duì)這個(gè)變量仍然可以可以使用VS的只能提示。現(xiàn)在dynamic則真正往動(dòng)態(tài)特性邁進(jìn)了一大步,根據(jù)Anders的解釋,dynamic是指動(dòng)態(tài)的靜態(tài)類型,也就是說它本質(zhì)上仍然是靜態(tài)類型,只不過它告訴編譯器忽略對(duì)它的靜態(tài)類型檢查,它會(huì)在運(yùn)行時(shí)才進(jìn)行類型檢查,它可以應(yīng)用在基本上所有的C#類型上面,如方法,操作符,索引器,屬性,字段,它其實(shí)是通過統(tǒng)一的方式來調(diào)用方法、屬性等操作
另外一個(gè)很重要地方Anders提到C#的未來時(shí)候指出C#4.0的特點(diǎn)是動(dòng)態(tài)編程.在一定程度上Dynamic超越了Var. Var 相當(dāng)于從3.0 到4.0版本一個(gè)過渡品.雖然二者使用方法有很多相似之處. 關(guān)于Dynamic更多信息 .Net4.0新特性資料有所說明.
B:一點(diǎn)疑問
Silverlight的項(xiàng)目經(jīng)理Justin Angel詳細(xì)介紹了如何啟動(dòng)Silverlight應(yīng)用以使用COM+ 文章中提到Silverlight 4可以通過COM+做的如下事情:
運(yùn)行命令或者可執(zhí)行(EXE)文件
讀注冊(cè)表
訪問本地ODBC
讀/寫硬盤(在上文提到的限制條件下)
自動(dòng)化Office
因?yàn)楹芏嗳艘呀?jīng)將Silverlight看作另一個(gè)Flash播放器,一個(gè)可限制訪問其運(yùn)行的計(jì)算機(jī)上的插件,所以讓Silverlight訪問COM+引來眾多人的關(guān)注。一方面它帶來了安全問題,另一方面它破壞了對(duì)其他平臺(tái)的可移植性。好幾個(gè)開發(fā)者在WPF Disciples(WPF愛好者)群組中發(fā)表評(píng)論:
Shawn Wildermuth說:我不想過多地爭論。我理解為什么微軟這樣做,但是我還是認(rèn)為這樣做很不妥。恕我直言,COM只能在Windows下運(yùn)行對(duì)其他平臺(tái)來說很不爽。
Marlon Grech,微軟客戶端應(yīng)用的MVP說:我很贊同Shawn所說的,為SL增加COM+支持違反了跨平臺(tái)和一次編寫處處運(yùn)行的主張。即使他們?yōu)锳ppleScript增加支持,對(duì)我們來說也是噩夢(mèng)一場(chǎng)。另外……我要說,武器本身沒什么問題,關(guān)鍵是使用這些武器的人。對(duì)吧?:)
Jeremiah Morrill:在我看來,主要的"概念上"的安全問題是"信任級(jí)別"。CoreCLR也還沒有授予"完全信任"模式,但這些COM實(shí)例,按照定義,是運(yùn)行在沙箱之外的。我想這會(huì)讓那些期望或設(shè)想得到A,卻拿到B的開發(fā)者和用戶都很迷糊……一般來說,在討論安全問題時(shí),這是不妥的。
對(duì)于一些人來說,COM+自動(dòng)化和在高級(jí)信任許可下運(yùn)行Silverlight應(yīng)用并不是什么安全問題,因?yàn)橛脩粜枰劝惭b才能運(yùn)行OOB應(yīng)用,他們也被明顯警告說應(yīng)用將會(huì)訪問他們的硬盤。理論上,這會(huì)像其他應(yīng)用一樣,運(yùn)行一個(gè)桌面應(yīng)用——但是,恐懼恐怕來自于Silverlight被假設(shè)成一個(gè)運(yùn)行在沙箱里的絕對(duì)安全的瀏覽器應(yīng)用,而不是一個(gè)桌面應(yīng)用。
另外一個(gè)問題是移植性。對(duì)于缺少COM+的Mac機(jī)而言,這個(gè)功能有什么用嗎?Angel提到說,微軟正在調(diào)查通過AppleScript在Mac機(jī)上支持COM的可能性,并說"如果微軟最終沒有決定在Mac機(jī)上支持Silverlight 4 RTM,那么,并不是因?yàn)樗荒茏龅?quot;。對(duì)于Moonlight,Angel說:
Moonlight在一開始創(chuàng)建時(shí),就有超級(jí)安全的模式。Mono支持在有著完全信任能力的GtkWidget中運(yùn)行Moonlight。所以,在Silverlight有高級(jí)權(quán)限模式時(shí),Mono確實(shí)完全信任模式。
同事,系統(tǒng)管理員可以對(duì)系統(tǒng)進(jìn)行配置,以阻止用戶安裝和運(yùn)行需要高級(jí)信任許可的OOB應(yīng)用。Group Policy Setting提到了更多關(guān)于這方面的信息.
Silverlight 4增加Com應(yīng)用 雖然在一定程度滿足企業(yè)級(jí)用戶對(duì)Silverlight 更為具體需要. 但在一定程度上顛覆Silverlight 在原始設(shè)計(jì)初衷.
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載