在Microsoft Office System中使用ADO.NET數據集(四)
2024-07-10 13:03:17
供稿:網友
在office文檔中使用dataset中的數據
一旦dataset中填充完畢你所需要的數據,并且斷開了數據庫連接,你就有多種方法在各種office文檔中使用這些數據。microsoft office system本質上不能處理大多數基于.net的對象,因此,通常你必須使用com互用性(com interoperability)來維護這些數據,并將這些數據轉換為你希望添入的工作表或其他文檔所能識別的數據類型。你可以在microsoft office system使用它新集成的xml功能來達到這種與.net對象的綜合應用。
將數據插入工作表
你可能使用過vba,那么你可以采用你在vba中使用的那些技術相類似的方式使用vb.net自動創建一個新的工作表。當然,如果你熟悉從外部應用程序自動創建工作表的技術,那么你完全可以使用與之完全相同的技術來自動創建一個工作表——比如那些使用microsoft visual basic 6編寫的代碼。然后,你需要將dataset中的內容插入到工作表中。
一個windows窗體可以使用定制的buildworksheet方法打開microsoft office excel 2003,添加一個工作簿,并使用適當的數據創建一個工作表。圖2顯示了這個結果。不幸的是,在excel中沒有一個屬性你可以分派dataset的引用給它——datagrid窗口和web窗體控件就有這種屬性。因此,你必須編寫一些代碼來完成這個任務。
圖2 已經用dataset中的數據填充了的excel 2003工作表
microsoft office system通過com對象公布各個對象。因此微軟發布了一套primary interop assemblies (主互操作程序集,pias),它專門針對.net對象訪問com對象進行了優化。你必須在每臺客戶機上安裝pias,而實際上,當安裝microsoft office system時就安裝了它們。
當安裝microsoft office system時,在安裝向導中選擇用戶自定義選項,如下面的圖3所示,你可以選擇或清除那些功能。其中的“支持.net編程”選項就是指安裝pias。你必須為每個你計劃與之自動互操作的.net兼容的應用程序安裝pias,并且你既可以將pias安裝到全局程序集緩存(gac)中,也可以將pias放置在你的項目文件夾。你可以從下面的文章中找到其它更詳細的信息: how to: install office primary interop assemblies.
圖3 使用向導安裝pias
當在基于.net的應用程序中使用excel 2003 pias,需要在visual studio .net 的“添加引用”對話框中添加對它們的引用,如圖4所示。一旦尼添加了這個引用,你就可以象維護.net程序集一樣維護excel com對象。
圖4 使用“添加引用”對話框添加對excel 2003 pias的引用
在這個adonet.vb windows 窗體中buildworksheet被定義成一個私有過程,它有且只有一個dataset參數。因為它實際上僅僅處理一個datatable對象(存儲客戶數據),代碼在開頭處聲明了一個名為dt的datatable變量,用以保存對該表的引用。
private sub buildworksheet(byval ds as dataset)
dim dt as datatable
為了維護excel工作簿,需要實例化一個excel應用程序對象,然后使用該對象模型添加一個新的工作簿,并更改工作簿的名字(例子中采用的是northwind customers),同時執行了其它ui方面的任務。
'create an instance of excel 2003, add a workbook,
'and let the user know what's happening
dim xl as new excel.application
xl.workbooks.add()
xl.activesheet.name = "northwind customers"
xl.visible = true
xl.range("a1").value = "loading the dataset...."
一旦加載并運行excel,這段代碼需要引用dataset ds中的相應表(datatable對象)。然后它遍歷datatable對象的列集合,將各個字段名寫到工作表的首行。該示例使用customers表和customers列標題。
try
xl.screenupdating = false
'start with the customers table
dt = ds.tables("customers")
'add the column headings for the customers
dim dc as datacolumn
dim icols as int32 = 0
for each dc in dt.columns
xl.range("a1").offset(0, icols).value = dc.columnname
icols += 1
next
所有剩下的工作就是遍歷表的所有行,使用datarow對象的itemarray屬性來將每個數據行的內容寫到工作表的一行中。這大約是excel將要直接支持dataset對象最顯著的征兆。
'add the data
dim irows as int32
for irows = 0 to dt.rows.count - 1
xl.range("a2").offset(irows).resize(1, icols).value = _
dt.rows(irows).itemarray()
next
catch ex as exception
這個過程中其余的代碼更新ui,并對工作表應用內建的格式化。
finally
xl.screenupdating = true
end try
'make the sheet pretty
with xl.activesheet.range("a1")
.autofilter()
.autoformat(excel.xlrangeautoformat.xlrangeautoformatsimple)
end with
xl = nothing
end sub
盡管microsoft office system本質上不支持.net對象,但是dataset的對象模型和功能使得將其結合到microsoft office system中,實現數據交互任務非常簡單。
注意: 你可以放心使用這個技術,而不用擔心dataset來自何處,它甚至可以來自于.net組件或web服務。