在Microsoft Office System中使用ADO.NET資料集(六)

來源:互聯網
上載者:User
ado|資料 使用Visual Studio Tools for the Microsoft Office System

到目前為止,例子都是使用標準的.NET Windows Form應用程式來插入DataSet對象中的資料到Microsoft Office 文檔中。這是一種針對Microsoft Office System中各種應用程式都非常有效技術,不論基於每個應用程式的物件模型如何改變,整個處理過程都是相同的。本質上講,Managed 程式碼可以運行Office,是因為它載入了Office物件模型到運行程式集的進程空間。然而,VBA開發人員習慣於他們編寫的代碼在文檔的後台執行,並且文檔與VBA代碼緊密相連。

這就是Visual Studio Tools for Office背後的部分目的。Visual Studio Tools for Office是一套新的Visual Studio .NET項目模板,它利用PIAs和COM interop(COM互操作)來在Excel和Word文檔後台運行Managed 程式碼。在Office文檔中不論是編寫還是調試VBA代碼,網路影響都是類似的。僅當使用Visual Studio Tools for Office時,Visual Studio .NET 2003使得編寫和調試與文檔緊密相連的Managed 程式碼可以在一個非常清晰的層次進行。

下一節介紹如何將資料填充到一個建立的Word文檔中,整個文檔是從一個模板建立的。該文檔的範例程式碼也包含一個Visual Studio Tools for Office項目,該項目插入資料到一個Excel工作表,這與前面介紹的例子完全相似。實際上,這兩個項目都可以僅僅使用PIAs而不使用Visual Studio Tools for Office來實現。但是,Visual Studio Tools for Office使得在設計時和運行時串連Managed 程式碼和Office文檔變得更為容易。

使用DataSet填充Word2003模板

長期以來,Office文檔中的書籤(Bookmark)提供了一種便利的方式在Word文檔中插入不連續資料片段。建立一個Word 2003模板,以適當格式插入書籤,然後以編程方式訪問書籤集合以便插入資料,--這都很容易實現。

當你建立一個Visual Studio Tools for Office項目時,你可以選擇是建立Word文檔還是Excel文檔。在下面的例子中,項目嚮導建立了一個名為VSTOWordTemplate.dot的模板,如圖8所示。



圖8:一個 Word 2003模板

請注意,圖8中,書籤的插人點是作為名字(name)和地址(address)的容器的。為了編碼方便,該文檔設計器將書籤的名字命名為與資料表中相應欄位的相同的名字。

用於填充書籤的值的代碼非常短,它運行在ThisDocument_New事件程序,當從該模板建立文檔時會觸發該事件。它先調用GetDataSet方法,以便建立DataSet對象,簡化版的GetDataSet在本文前面就介紹了。這個版本僅僅使用Customers表建立一個DataSet。

Private Sub ThisDocument_New() Handles ThisDocument.New

Dim ds As DataSet = GetDataSet()

然後,獲得文檔中書籤、相關表和六個資料行的引用。最後的代碼非常武斷,但是真實的應用程式應該包含某些機制,讓使用者可以選擇特定的使用者名稱來產生這個信封。

'Fill in the document bookmarks

Dim bookmarks As Word.Bookmarks = ThisDocument.Bookmarks

Dim bookmark As Word.Bookmark

Dim dt As DataTable = ds.Tables("Customers")

Dim dr As DataRow = dt.Rows(5)

最後,代碼遍曆書籤集合,用資料表中名字相同的欄位的值替換各個書籤的文本。

For Each bookmark In bookmarks

Dim bookmarkName As String = bookmark.Name

bookmark.Range.Text = dr(bookmarkName)

Next

End Sub

圖9 顯示運行這個過程的結果



圖9 使用DataSet中的資料填充書籤文本,運行結果

關於記憶體管理

在.NET中與基於COM的Office物件模型互動時, COM對象的釋放(disposal)和記憶體管理需要特別注意。當使用.NET編寫Office解決方案時,你擁有一個.NET用戶端通過運行時可調用封裝(runtime-callable wrapper ,RCW)與COM通訊。RCW是在運行時由CRL根據Interop程式集中的中繼資料資訊動態建立的代理。,對於.NET用戶端,RCW表現的像任何其他CLR對象,但是RCW實際上扮演了一個代理的角色,它負責在.NET用戶端和COM對象之間封送(marshalling)調用。這種關係的副作用就是COM世界確定的物件存留期管理與.NET世界的非確定的記憶體回收之間不匹配。這種不匹配可能導致對象沒有從記憶體釋放、應用程式掛起,或者其他無法預料的行為。

使兩者和諧的一種主要的方法就是為你已執行個體化的每個COM對象調用Marshal.ReleaseCOMObject方法。Marshal.ReleaseCOMObject方法規定COM對象必須確定的釋放,調用它後你就可以確信記憶體中不再有剩下的沒有被使用的對象了。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。