標籤:word c# vba
想當年省電腦一級考了60飄過,暗自竊喜。
如今要考慮它是怎麼給我判了個60分。
當年不會做Excel題,OUTLOOK題,IE題。
如今要搞清楚它判分的邏輯是什麼。
兩年如此大的差距,暈暈的開始沒有頭緒,後來...
矯情一番,收。什麼是WORD物件模型?
初步認識:
word主要有五大對象,Application,Document,Selection,Bookmarks,Range。
- Application:代表Microsoft Word應用程式本身,是所有對象的基類,對word環境的控制是通過Application的一些屬性和方法。
- Document:代表一個word文檔,就是點擊你案頭上右擊,建立一個word文檔,那個執行個體化出來的對象就是document對象。因為是Application的子類,所以可以通過Application對象的activedocument屬性擷取當前文檔對象。
- Selection:代表當前選中的地區(高亮),沒有選中地區時代表游標點。
- Bookmarks:書籤。
- Range(很常用):代表一塊地區,與Selection類似,不過一般不可見
1>包含一個起始位置和一個結束位置
2>它可以包含游標點,一段文本或者整個文檔
3>它包含空格,tab以及paragraph marks
4>它可以是當前選中的地區,當然也可以不是當前選中地區
5>它被動態建立
6>當你在一個Range的末尾插入文本,這將擴充該Range
找到技巧:
我用了一天的時間查了很多資料關於VBA,關於C# Winform開發word對象。發現這些知識很散很零碎,為什麼這麼說呢?首先word對象很多,譬如一個文檔,一個段落,一個可選地區等等。一個對象又有N多的屬性和方法。查了一天的資料,除了震驚它的強大之外,沒別的想法。。冷靜過後,覺得,大海撈針一般去查去找。不如把這一年的word操作題分類匯總,包括所有的操作題分類匯總。
於是我們做了以下的工作:
1、將所有題進行橫向對比,找到固定題型,將一個大問題word操作,使它的粒度變小。
2、分到任務的人,主要去找這個東西是word下的什麼對象,找它對應的屬性和方法。
3、判分的關鍵點在於最後結果,至於過程不重要。例如:不管他是怎麼移動的,總之最後結果是A存在,B不存在就好。
執行個體操作:
1、第一步引用word對象。在擴充中選擇Microsoft.Office.Interop.Word。
在類檔案中添加應用如下:
using Word = Microsoft.Office.Interop.Word;using System.IO;using System.Reflection;
2、找到你要操作的對象,和想尋找該對象的某個屬性。
例1:
題目是將全文的“.”替換為“。” 因為我們要最後的結果,我就想到用IndexOf()去尋找“.”的位置,如果找不到它的位置返回為-1,就證明沒有這個符號。
首先對複用的語句可以寫成一個Wordhelper:
/// <summary> /// 讀取 word文檔 返回內容 /// </summary> /// <param name="path"></param> /// <returns></returns> public static string GetWordContent(string path) { try { Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application(); Type wordType = app.GetType(); Microsoft.Office.Interop.Word.Document doc = null; object unknow = Type.Missing; app.Visible = false; object file = path; doc = app.Documents.Add (ref file, ref unknow, ref unknow, ref unknow); int count = doc.Paragraphs.Count; StringBuilder sb = new StringBuilder(); for (int i = 1; i <= count; i++) { sb.Append(doc.Paragraphs[i].Range.Text.Trim()); } //關閉word進程 doc.Close (ref unknow, ref unknow, ref unknow); wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, app, null); doc = null; app = null; //記憶體回收 GC.Collect(); GC.WaitForPendingFinalizers(); string temp = sb.ToString(); return temp; } catch { return ""; } }
這個方法,只有你傳路徑給它,它就可以返回給你文檔中的內容。我們就可以去尋找文檔中的文字了。
private void button1_Click(object sender, EventArgs e) { //判斷尋找替換題,是否完成正確 string wordcontent = GetWordContent(@"H:\12080141043.docx"); //得到wordcontent為word中的內容 int keyword = wordcontent.IndexOf("."); //keyword是要尋找的關鍵字 if (keyword == -1) //等於-1代表沒有找到它的位置,證明替代成功。 { MessageBox.Show("我沒有找到英文句號哦,替換成功,加一分!!"); } else { MessageBox.Show("我發現了英文句號哦,替換失敗,不加分!!"); } }
上面的wordhelper中就用到了Application對象和document對象擷取文檔中的paragraphs。
例2:設定行間距的最小值等屬性。我們要考慮如何取得doc對象,確定是哪個屬性。
private void button1_Click(object sender, EventArgs e) { //設定全文段落:設定文章中本文文字為宋體、小四號字,靠左對齊,首行縮排2字元,行距為最小值20磅。 Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application(); object unknow = Type.Missing; object file = "H:\\12080141043.docx"; Microsoft.Office.Interop.Word.Document doc = app.Documents.Add(ref file, ref unknow, ref unknow, ref unknow); //行間距為22 string rightkey = "22"; if (app.Selection.ParagraphFormat.LineSpacing.ToString()==rightkey ) { MessageBox.Show("當前行距為最小值22磅。設定成功+1分!"); } else { MessageBox.Show("設定失敗!"); } //字型設定為小四 ==14 string rightsize = "14"; if (doc.Paragraphs.Last.Range.Font.Size.ToString()==rightsize ) { MessageBox.Show("當前本文字型為小四號體,設定成功+1分!"); } else { MessageBox.Show("設定失敗!"); } //字型為黑體 string rightstyle = "黑體"; if (doc.Paragraphs[1].Range.Font.Name == rightstyle) { MessageBox.Show("當前本文字型黑體的,設定成功+1分!"); } else { MessageBox.Show("設定失敗!"); } //靠左對齊 //app.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; if (app.Selection.ParagraphFormat.Alignment == Word.WdParagraphAlignment.wdAlignParagraphLeft) { MessageBox.Show("當前設定為靠左對齊,加一分!"); } else { MessageBox.Show("設定失敗!"); } // 首行縮排2個字元 32.15 string firstline = "32.15"; if (app.Selection.ParagraphFormat.FirstLineIndent.ToString()==firstline ) { MessageBox.Show("設定首行縮排兩個字元成功!加一分!!"); } else { MessageBox.Show("設定失敗!"); } }
這兩個只是一個例子,比如版面設定,頁首頁尾的設定都可以實現的。等著你去發現~
小結:
開始覺得這個任務很難,之前沒有接觸過VBA,後來查了一些資料,才發現什麼都是可以實現的,就怕你不敢想。開始因為恐懼不敢開始,不如把困難最小化,一個一個的攻破。感謝這篇部落格,給我帶來很多的協助:http://www.cnblogs.com/eye-like/p/4121219.html
還有這一篇C#word常用操作匯總BaiDu文庫。
最近體會很深刻的:
1、開始都不知道自己在百度什麼東西,需要一點點的去改變搜尋索引鍵。
2、遇到多,大,散的東西。就歸類,匯總。把問題集中,分到各個人去解決小問題。大問題就不攻自破了。
3、給自己及時的反饋,積累有信心去解決下一個大問題!
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
快速上手之 C#操作WORD物件模型