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的效果如下圖: