C#操作Microsoft.Office.Interop.Word類庫完整例子

2023-11-16 15:00:57
使用Microsoft.Office.Interop.Word類庫操作wor檔案
一.準備工作
首先在工廠中,參照【Microsoft.Office.Interop.Word】,本地安裝了world,就能找到這個類庫,如下圖。Form1系統自動生成的

Form1的介面很簡單,就一個按鈕

 二 4個完整範例

4個範例,自測過的,都可用,適用很多種情況操作world。完整程式碼如下

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Threading.Tasks;
  9 using System.Windows.Forms;
 10 using MSWord = Microsoft.Office.Interop.Word;
 11 
 12 namespace _24_word_and_excel_Operator
 13 {
 14     public partial class Form1 : Form
 15     {
 16         object oMissing = System.Reflection.Missing.Value;
 17         public Form1()
 18         {
 19             InitializeComponent();
 20         }
 21 
 22         private void button1_Click(object sender, EventArgs e)
 23         {
 24             //例子1:新建一個word檔案,填入自定義的內容
 25             Example1();
 26 
 27             //例子2:操作模板的例子
 28             Example2();
 29 
 30             //例子3:操作模板的例子,是例子2的一個簡單版本
 31             Example3();
 32 
 33             //例子4:複雜的例子,操作模板,標籤內填值,檔案中畫表格,表格中填值。檔案中填
 34             Example4(@"D:\110 - C#範例集合\100 - 範例集合\24 word and excel Operator\bin\Debug\測試檔案.docx");
 35         }
 36         /// <summary>
 37         /// 新建一個word檔案,填入自定義的內容
 38         /// </summary>
 39         private void Example1()
 40         {
 41             //建立一個新的Word應用程式物件
 42             Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
 43             //建立一個新的Word檔案物件,就是建立一個空白的檔案
 44             MSWord.Document doc = wordApp.Documents.Add();
 45             // 在新檔案中新增內容
 46             MSWord.Paragraph paragraph = doc.Paragraphs.Add();
 47             paragraph.Range.Text = "Hello, World! This is a sample Word document.";
 48 
 49             // 儲存檔案,注意:filePath路徑要帶上檔名
 50             string filePath = @"D:\110 - C#範例集合\100 - 範例集合\24 word and excel Operator\bin\Debug\Test\test.docx";
 51             doc.SaveAs(filePath);
 52 
 53             // 關閉Word應用程式
 54             wordApp.Quit();
 55         }
 56 
 57         /// <summary>
 58         /// 操作模板的例子
 59         /// </summary>
 60         private void Example2()
 61         {
 62             // 模板檔案路徑
 63             string templatePath = @"D:\110 - C#範例集合\100 - 範例集合\24 word and excel Operator\bin\Debug\測試檔案.docx";
 64             // 生成的檔案儲存路徑
 65             string newDocumentPath = @"D:\110 - C#範例集合\100 - 範例集合\24 word and excel Operator\bin\Debug\Test\例子2檔案.docx";
 66 
 67             // 建立Word應用程式物件
 68             Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
 69 
 70             // 開啟模板檔案
 71             Microsoft.Office.Interop.Word.Document templateDocument = wordApp.Documents.Open(templatePath);
 72 
 73             // 複製模板檔案的內容
 74             templateDocument.Content.Copy();
 75 
 76             // 建立一個新的空白檔案
 77             Microsoft.Office.Interop.Word.Document newDocument = wordApp.Documents.Add();
 78 
 79             // 將複製的內容貼上到新檔案中
 80             newDocument.Content.Paste();
 81 
 82             // 修改新檔案的內容
 83             MSWord.Paragraph paragraph = newDocument.Content.Paragraphs.Add();
 84             paragraph.Range.Text = "This is a document generated from a template.";
 85 
 86             // 儲存新檔案
 87             newDocument.SaveAs(newDocumentPath);
 88 
 89             // 關閉模板檔案
 90             templateDocument.Close();
 91 
 92             // 關閉Word應用程式
 93             wordApp.Quit();
 94         }
 95         /// <summary>
 96         /// 操作模板的例子,是例子2的一個簡單版本
 97         /// </summary>
 98         /// <param name="templatePath"></param>
 99         /// <param name="outputPath"></param>
100         public void Example3()
101         {
102             string templatePath = @"D:\110 - C#範例集合\100 - 範例集合\24 word and excel Operator\bin\Debug\測試檔案.docx";
103             string outputPath = @"D:\110 - C#範例集合\100 - 範例集合\24 word and excel Operator\bin\Debug\Test\例子3的檔案.docx";
104 
105             // 建立Word應用程式物件
106             Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
107             // 開啟模板檔案
108             MSWord.Document wordDoc = wordApp.Documents.Open(templatePath);
109             {
110                 //這裡就是要幹什麼事了,替換文字,新增內容等操作
111                 // 替換模板中的文字
112                 FindAndReplace(wordDoc, "要替換的文字", "替換後的文字");
113                 // 修改新檔案的內容
114                 MSWord.Paragraph paragraph = wordDoc.Content.Paragraphs.Add();
115                 paragraph.Range.Text = "This is a document generated from a template.";
116             }
117 
118             // 儲存為新檔案
119             wordDoc.SaveAs2(outputPath);
120             // 關閉Word應用程式物件
121             wordApp.Quit();
122         }
123 
124         private void FindAndReplace(MSWord.Document doc, string findText, string replaceText)
125         {
126             // 將模板設為可編輯
127             doc.Activate();
128 
129             // 執行查詢和替換操作
130             // 可以使用其他查詢和替換方法,例如使用Range物件
131             object findObj = findText;
132             object replaceObj = replaceText;
133             object missingObj = Type.Missing;
134             doc.Content.Find.Execute(ref findObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj,
135                 ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref replaceObj, ref missingObj,
136                 ref missingObj, ref missingObj, ref missingObj, ref missingObj);
137         }
138         private void Example4(string strPath)
139         {
140             object oTemplate = strPath;
141             MSWord.Application wordApp = new MSWord.Application();// 建立一個新的Word應用程式物件
142             wordApp.Visible = true;
143             MSWord.Document oDoc = wordApp.Documents.Add(ref oTemplate, ref oMissing, ref oMissing, ref oMissing);// 建立一個新的Word檔案物件
144 
145             //填寫標籤
146             object[] bookMark = new object[3];
147             bookMark[0] = "Test1";
148             bookMark[1] = "Test2";
149             oDoc.Bookmarks.get_Item(ref bookMark[0]).Range.Text = "第1個標籤";
150             oDoc.Bookmarks.get_Item(ref bookMark[1]).Range.Text = "第2個標籤";
151 
152 
153             //定義一個Word中的表格物件
154             oDoc.Paragraphs.Last.Range.Text = "直接接入式(正向電能)";
155             //用於在Word檔案中進行特定的文字插入和調整操作
156             object unite = MSWord.WdUnits.wdStory;//這表示將選擇操作的範圍設為整個檔案
157             oDoc.Content.InsertAfter("\n");//在檔案的內容後面插入一個換行符("\n"),即實現在檔案末尾新增一個空行
158             wordApp.Selection.EndKey(ref unite, ref oMissing);//將選擇操作的焦點移動到檔案的結尾,即將遊標定位在檔案的最後一行。
159             wordApp.Selection.ParagraphFormat.Alignment = MSWord.WdParagraphAlignment.wdAlignParagraphLeft;//將遊標所在處的段落對齊方式設定為左對齊。
160             object WdLine2 = MSWord.WdUnits.wdLine;//換一行;這表示將選擇操作的單位設為行。
161             wordApp.Selection.MoveDown(ref WdLine2, 6, ref oMissing);//將當前選擇向下移動6行。
162 
163             int iRow = 5;
164             int iColumn = 3;
165             MSWord.Table table = oDoc.Tables.Add(wordApp.Selection.Range, iRow, iColumn, ref oMissing, ref oMissing);
166             table.Borders.Enable = 1;
167             for (int i = 1; i < iRow + 1; i++)
168             {
169                 if (i == 1)
170                 {
171                     table.Cell(i, 1).Range.Text = "電壓(V)";
172                     table.Cell(i, 2).Range.Text = "電流(A)";
173                     table.Cell(i, 3).Range.Text = "電能誤差(%)";
174                 }
175                 else
176                 {
177                     table.Cell(i, 1).Range.Text = (i + 1).ToString();
178                     table.Cell(i, 2).Range.Text = (i + 2).ToString();
179                     table.Cell(i, 3).Range.Text = (i + 3).ToString();
180                 }
181             }
182             //該行程式碼的作用是將表格中所有段落的對齊方式設定為居中對齊
183             table.Range.ParagraphFormat.Alignment = MSWord.WdParagraphAlignment.wdAlignParagraphCenter;
184 
185             //檔案最後填寫文字
186             oDoc.Paragraphs.Last.Range.Text = "檔案最後的位置:\n\r";
187 
188             string docname = string.Empty;
189             docname = $"檔名稱";
190 
191             //彈出儲存檔案對話方塊,儲存生成的Word
192             SaveFileDialog sfd = new SaveFileDialog
193             {
194                 Filter = "Word Document(*.docx)|*.docx",
195                 DefaultExt = "Word Document(*.docx)|*.docx",
196                 FileName = docname
197             };
198             if (sfd.ShowDialog() == DialogResult.OK)
199             {
200                 object filename = sfd.FileName;
201                 oDoc.SaveAs(ref filename, ref oMissing, ref oMissing, ref oMissing,
202                 ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
203                 ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
204                 ref oMissing, ref oMissing);
205 
206                 // 關閉Word應用程式物件
207                 wordApp.Quit();
208             }
209         }
210     }
211 }

 

三 程式碼分析解讀 (重點部分)

 例子1:適用的情況是,程式碼建立一個新的world檔案的情況

注意:無論是例子1,例子2,例子3,其中的路徑,要填寫自己原生的路徑。

 

 

例子2和例子3:

兩個例子都是操作world模板的,例子2程式碼複雜寫,例子3精簡寫。效果都是一樣的。

例子3中,SaveAs2 方法是 SaveAs 方法的擴充套件版本,支援更多的儲存選項和引數。例子3中, wordDoc.SaveAs2(outputPath);中 outputPath是指定要儲存檔案的完整路徑,包括檔名和副檔名。效果如下圖

 

例子4:這個例子稍微複雜一下,設計檔案中先插入好標籤,標籤地方填值,檔案中畫出表格,表格中填值,檔案最後追加檔案等操作。

模板檔案的標籤如下圖:

例子4的效果如下圖: