原創Office開發收藏

2023-01-15 06:03:05 字數 3545 閱讀 3814

有時我們的資料並不是儲存在資料庫中,而是儲存在 excel 電子**或 word 文字文件,我們要怎麼讀取或顯示,在 中微軟為 office 開發提供了很好的可程式設計性。

/kaneboy/articles/高手的講解,很是清晰。牛人真的牛 。

我們要用c#寫乙個windows應用程式, 在這個程式中,啟動word,用**操作它做一些操作,然後再關閉掉它。

首先,我們建立乙個新的c# windows應用程式,然後通過上面介紹過的方法,在專案中引用word的pia(在新增引用的介面中,選擇com元件列表中的microsoft word 11 object library)。

在自動建立的啟動窗體上,放兩個button控制項,乙個叫做 btnstartword,另外乙個叫做btnstopword。我們希望當使用者點選btnstartword時,我們的程式自動啟動word,然後建立乙個新的word文件,然後將其自動儲存在磁碟上,當使用者點選btnstopword時,就關閉掉word。窗體設計檢視如下。

在這個主窗體類的源**中,我們引用word pia的命名空間,我們使用msword來替代這個完整的命名空間名稱:

using msword =

在主窗體類的原始碼中,新增乙個類級別的成員,_wordapp是乙個application型別的物件(記住:是乙個介面!):

private _wordapp = null;

然後在btnstartword按鈕的點選事件**中,新增如下**,**建立乙個新的word例項,然後顯示它:

_wordapp = new

_ = true;

看到這裡,很多人有乙個非常大的疑惑,那就是實際上是乙個介面,那麼我們怎麼可能通過「new 來建立乙個word例項呢?難道我們不應該使用「new 來做嗎?畢竟applicationclass才是實現application介面的具體類啊。

在這裡,office pia為我們提供了乙個小小的「cookie」,我們實際上的確可以使用「new 來建立乙個word程式例項的,我們只需要知道,office pia會在底下自動幫我們建立乙個真正的word程式例項。

接下來,我們在btnstartword按鈕的事件**中,再新增如下的**。

object missing =

object sfilename = "c:\\";

docs = _

doc = missing, ref missing, ref missing, ref missing);

sfilename, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

missing, ref missing, ref missing);

在上面的**中,我們通過訪問application的documents屬性,得到乙個documents類,然後通過documents類的add() 方法,建立乙個新文件,並得到對應這個新文件的型別為document的物件,然後通過document類的s**eas()方法將文件儲存在磁碟上,最後通過document類的close()方法關閉這個新文件。

嗯,我知道我其實解釋得不夠徹底,上面**中的那些 ref、missing之類的東東,到底是什麼意思,為什麼要用它們,相信不少人都非常迷惑(特別是曾經用vba或其他語言訪問過office com元件介面的程式設計師而言)。這其實牽涉到用c#語言呼叫office程式設計介面的乙個「語法相容」問題。就是說,office的產品開發組在對程式設計介面進行設計時,實際上是專門設計為被vba呼叫的,所以介面都非常配合vba的語法,使vba程式設計師盡量感到方便。

但是由於c#語法和vb語法有很多不同, 所以在用c#訪問office程式設計介面時,就會感到非常的「彆扭」。

這這裡,我只想對上面的**做如下簡要的額外解釋:

(1)很多的office程式設計介面中的方法,都帶了非常多的引數(比如方法有16個引數!!!),而實際上我們呼叫它們的時候,並不是每乙個引數都需要明確給乙個特定的值的(比如方法只需要明確給定第乙個引數,即儲存到**),那麼對於不需要給定明確值的引數,我們可以直接傳乙個.net類庫中自帶的靜態物件:

就可以了。

(2) 很多的office程式設計介面中的方法,其引數都必需傳引用,而不能傳值,所以,呼叫這些方法的時候,對於引數都需要加上c#中的ref關鍵字。比如上面**中的方法,它們的引數都必須傳引用,所以每個引數前面都加上了ref關鍵字。

對於使用c#語言呼叫office程式設計介面時,對「語法相容」問題的更全面的描述,請參看《office with .net(二)之外傳―――c#訪問office程式設計介面時的「語法相容」問題》。

繼續為我們的專案新增**。在btnstopword按鈕的事件**中,填充下面的**:

object missing =

_ missing, ref missing, ref missing);

_wordapp = null;

上面的**通過呼叫方法,退出word程式。更值得關注的部分是如何釋放掉word程式例項。上面的**用了乙個簡單但是很有效的方法,讓word程式程序被關閉**,首先將物件_wordapp重新賦值為null,這樣底下的那個word application物件將不再被任何變數引用,最後通過強行呼叫.

net framework中的垃圾收集方法,使application物件能夠被垃圾**器**掉。(實際上,.net framework的垃圾**器**的只是office pia的乙個包裝類物件而已,但是這個包裝類物件被**後,對應word程式的com元件物件會發現自己不再被其他任何物件引用,引用計數變為了0,於是,那個com元件就會被真正釋放掉了。

)如何保證在自己的應用程式中關閉office程式其實是乙個不小的問題,上面描述的方法並不是100%有效的,對這個話題更完整的描述請參考《office with .net(二)之外傳―――「徹底乾淨的」關閉office程式》一文。

我們的第乙個示範程式到這裡就已經寫完了,現在我們可以執行一下這個程式,然後先點選第乙個按鈕啟動word,並操作word建立乙個新文件後再儲存到磁碟上,接著點選第二個按鈕關閉掉word。

(四) 總結

這篇文件簡要描述了如何在.net中訪問office的程式設計介面,講解了office pia的概念和使用方法。從這篇文章可以看出,在.

net中操作office是非常簡單而直接的,微軟通過提供office pia,大大簡化了.net程式設計師的工作。

////// 查詢 word 資料並新增到 datatable

////// 檔名

///public datatable read_words_data(string file_name)

//把 word **裡的資料複製到 datatable 裡

for (int i = 2; i <= i++)

} omissing, ref omissing, ref omissing);//關閉文件物件

omissing, ref omissing, ref omissing);

oword = null;

垃圾**

return dt;}

蘇州Office培訓 Office2019新功能

microsoft office 2013 新功能課程簡介 本課程面向具備office軟體應用基礎 需要由office2007 2010公升級至office2013的企業使用者,課程中將涉及office2013中的新功能和受新功能影響的部分原有功能,包含對excel ppt word三款軟體的講解及...

Office培訓心得

在這次培訓中,我學到了很多東西,感謝學長對我們的教育,使我對office辦公軟體有了一定的熟悉 但是熟悉的程度畢竟有限。所以很感謝這次團校裡組織的這節培訓課。在3月29日的團校培訓課上,通過計算機學院學長對office辦公軟體的講解,使我對office中的word 及軟體有了更加詳細的認識,主要表現...

面試技巧Office

如 你經歷太單純,而我們需要的是社會經驗豐富的人 你性格過於內向,這恐怕與我們的職業不合適 我們需要名牌院校的畢業生,你並非畢業於名牌院校 你的專業怎麼與所申請的職位不對口?面對這種咄咄逼人的發問,作為應聘者,首先要做到的就是無論如何不要被 激怒 如果你被 激怒 了,那麼你就已經輸掉了。那麼,面對這...