最近這段時間,一直忙於修改一個我感覺從設計和編碼方面都很爛的一個系統,各種軟件設計中的錯誤,我們一邊給他修改功能,一邊進行代碼重構,其中,讓我感覺比較麻煩的是Office的操作,所以我就花了一點時間總結了這個項目中需要的Office.Word的基本操作,主要是在這項目中用到的操作,沒有用到的也就沒有涉及到。
首先,我要說一下的是Word中的表格操作。在我的程序中我是用WordTable這個類來實現的。按照一般思維,我們首先是需要一個Table對象,顯然,這個對象是 Microsoft.Office.Interop.Word.Table類型的。有了這個表格對象了,我們就可以在上面進行操作了,一幫的Table操作都有啥哪?
1.構造一個表格(除了使用構造函數來構造WordTable這個類以外)我還專門寫了一個函數來構造表格。在這里我給出這個函數的完整代碼((*^__^*) 有原因的)
public void ConstructTable(List<int> columnWeight) { _SetTableStyle(ref tableOne); DesginTableEvent(ref this.tableOne, columnWeight); }
這個函數里面調用了一個DesginTableEvent類似一個函數的東西,其實...
public delegate void DesginTableHandler(ref Microsoft.Office.Interop.Word.Table table, List<int> columnWeight); public event DesginTableHandler DesginTableEvent;
相信你已經看懂了,對了這是一個事件函數,我們為什么這樣設計哪,其實不難想想,你想,我們設計的表格是千變萬化的,怎么可能使用一個簡單的函數就能搞定了哪,我們肯定要會根據每個人的不同來進行自己設計啊,是啊,DIY的表格式多么有吸引力啊,這里我們就是基於這個目的的((*^__^*) 有點大..)
2.上面的函數中有一個_SetTableStyle(ref tableOne)的函數,這個是設計表格的樣式的函數,由於我們修改的項目的表格樣式都基本上都是一致的所以,這里我把這個函數寫成了一個私有的函數,大家可以參考其中的內容進行自己的DIY設計。
3.這里,我們馬上就要接觸到具體的表格操作了,先問自己一個問題,如何簡單的表示表格,YES!用單元格,那如何表示一個單元格,YES!行和列,所以,我就用一個新的類來表示表格中的單元格,WordTableCell,這里不用給出具體的代碼,大家都應該明白其中有啥了吧。
4.下面我們開始真正的表格操作,第一個你想到的可定是如何填表了。我們使用了函數
public void FillingTableContent(Dictionary<WordCell, string> cellContent),應該很容易看明白這個函數的意圖和用法吧(如果實在不明白,可以參考完整源代碼,里面有詳細的說明)
5.合並單元格函數 void MergeCell(WordCell merge, WordCell merged)
6.合並標題性質的函數 public void MergeTitleCell(WordCell merge, WordCell merged),這個函數與上面的函數的區別在於:上面的單元格只是簡單的合並單元格,而這個合並以后會出現標題形式(我是個工科學生,真的沒有辦法有語言來解釋啥叫標題形式的,你可以運行代碼自己看或是看下面的圖片)
這個是標題式的合並
這個是一般的單元格的合並,(其實看起來差不多,其實是有差別的,請仔細比較)
7.在一個表格行后面添加一個行 public void AddTableRow(int row)
8.在一個表格行后面刪除一行 public void DeleteTableRow(int row)
9.在一個表格列后面添加以列 public void AddTableColumn(int column)
10.在一個表格最后添加一列 public void AddColumnEndTable()(可以用上面的實現,但是由於非常常用,所有我單獨拿出來,其實內部也是用上面的這個函數實現的)
11.在表格最后添加一行 public void AddRowEndTable()(不解釋)
12.獲得表格當前的行數 public int CurrentTableRow(這是個屬性)
13.獲得表格當前的列數 public int CurrentTableColumn
還有很多的操作可以完成,我這里只是使用了這些,所有就說這么多
下面我們開始進行Word操作的說明。主要也就是類MyWord(這個是我自己的類)的實現
protected Microsoft.Office.Interop.Word.Application _WordApplicMain;
protected Microsoft.Office.Interop.Word.Document _MainDoc;
上面這兩個,不管你是否知道啥意思,都必須包含在你的類中,其實我們可以望文生義的認為,_WordApplicationMain這個是用來管理整個Word應用程序的,而_MainDOc這個僅僅是表示的是Word中的文檔元素(是不是感覺起一個好的名字,可以讓你的API更加流行,尤其是這種分層的命名方法,也就是一層一層的加上命名空間的方法,是不是看起來很爽啊!(*^__^*) )。下面我們按照一般Word操作的順序來說明。
1.要操作Word必須打開(新建)一個Word. CreateWord()這個函數就幫你搞定了,但是,你必須在構建MyWord類是傳遞一個保存路徑,不然的話,新建的word就保存到了默認的路徑(看代碼中)下。
2.設置頁面格式函數 public void SetPageDefaultStyle(MyWordPageStyle myWordPageStyle) 其中,有個MyWordPageStyle的類。
3.設置當前頁面格式的函數 public void SetCurrentPageStyle(MyWordCurrentStyle currentPageStyle)其中,有個MyWordCurrentSytle的類
4. 向Wrod中寫入內容的函數:public void WriteContent(string content)
5.換頁 public void Feed()
6. 設置頁眉 public void SetPageHeader(string pageHeaderContent)
7.設置頁腳 public void SetPageFooter(string pageFooterContent)
8.下面的幾個函數是在Word中添加表格,一開始想把表格創建放到WrodTable這個類中,但是,最后想了想,只有Word才可以創建表格,而表格自己創建了表格放在那里啊,所有,果斷的把Word創建表格的方法放在了MyWrod中.
創建表格
public void CreateTable(int rowNumber, int columnNumber, List<int> columnWeight) { _WordTable = new MyWordTable.WordTable(); _WordTable.TableOne = _MainDoc.Tables.Add(_WordApplicMain.Selection.Range, rowNumber, columnNumber, ref Nothing, ref Nothing); _WordTable.DesginTableEvent += _DesginTable; _WordTable.ConstructTable(columnWeight); }
你可能欣喜的發現,我們終於使用了_WordTable.DesginTableEvent += _DesginTable;然而,當你看到下面一個函數時,你又是一頓失望,(這么麻煩)
protected virtual void _DesginTable(ref Microsoft.Office.Interop.Word.Table table, List<int> columnWeight) { DesginTable(ref table, columnWeight); _WordTable.TableOne = table; }
public delegate void DesginTableHandler(ref Microsoft.Office.Interop.Word.Table table, List<int> columnWeight); public event DesginTableHandler DesginTable;
我暈,又是一次....
這下你明白了嗎?是不是更暈了,這里不做過多的解釋,如果想看的更明白,請參考完整代碼。
9. public void SaveWord()((*^__^*) 我不知道這個是干嘛的,你知道嗎?)
以上基本上已經是一個相對比較完整的Word操作了,但是,在我們的項目中,有了很大的Word模板,所以,這里我也加入了MyWordWithTemplate這個類,關於這個類的解釋,我在MyWordWithTemplate.cs中開始做了解釋,這里不在廢話了。
這個類中沒有什么其他的,就是一些常用的函數,這里也就不過多的說明。好了,希望大家在我這個基礎上加入更多的功能,我已經搭建了一個名字很大的項目,叫(忘了),里面的層次應該還算是比較清晰,希望大家在這個基礎上再添加新的功能。
完整代碼下載:Microsoft.Office.rar(名字夠唬吧)