如何自動化 Microsoft Word 以從 Visual C 執行合併列印#
如需本文的 Microsoft Visual Basic .NET 版本,請 參閱301656。
摘要
本文示範如何使用 Microsoft Visual C# 2005 或 Microsoft Visual C# .NET,將 Microsoft Word 自動化以建立合併列印檔。
其他相關資訊
自動化是一種程式,可讓以 Visual C# 2005 或 Visual C# .NET 等語言撰寫的應用程式,以程式設計方式控制其他應用程式。 Word 自動化可讓您執行動作,例如建立新檔、將文字新增至檔,以及格式化檔。 使用 Word 和其他 Microsoft Office 應用程式,您幾乎可以透過使用者介面手動執行的所有動作,也可以使用自動化以程式設計方式執行。
Word 會透過物件模型公開此程式設計功能。 物件模型是類別和方法的集合,可做為 Word 邏輯元件的對應專案。 例如,有一個 Application 物件、一個 Document 物件和一個 Paragraph 物件,每個物件都包含 Word 中這些元件的功能。 若要從 Visual C# 2005 或 Visual C# .NET 存取物件模型,您可以設定型別程式庫的專案參考。
本文示範如何將適當的專案參考設定為適用于 Visual C# .NET 的 Word 型別程式庫,並提供範例程式碼來自動化 Word。
建置自動化範例
啟動 Microsoft Visual Studio 2005 或 Microsoft Visual Studio .NET。
在 [檔案] 功能表上,按一下 [新增],然後按一下 [專案]。 從 Visual C# 專案類型中選取 [Windows 應用程式]。 根據預設,會建立 Form1。
在 Visual Studio 2005 中新增 Microsoft Word 11.0 物件程式庫 或 Visual Studio .NET 中 Microsoft Word 物件程式庫的參考。 如果要執行這項操作,請依照下列步驟執行:
按一下 [專案] 功能表上的 [加入參考]。
在 [COM] 索引標籤上,找出 [Microsoft Word 物件程式庫],然後按一下 [選取]。
在 Visual Studio 2005 中,于[COM] 索引標籤上找出[Microsoft Word 11.0 物件程式庫]。
注意 Microsoft Office 2003 包含主要 Interop 元件 (PIA) 。 Microsoft Office XP 不包含 PIA,但可以下載。
按一下 [新增參考] 對話方塊中的 [確定] 以接受您的選擇。
在 [檢視] 功能表上,選取 [工具箱] 以顯示工具箱,然後將按鈕新增至 Form1。
按兩下 Button1。 表單的程式碼視窗隨即出現。
在程式碼視窗中,取代下列程式碼
private void button1_Click(object sender, System.EventArgs e) { }
搭配:
Word.Application wrdApp; Word._Document wrdDoc; Object oMissing = System.Reflection.Missing.Value; Object oFalse = false; private void InsertLines(int LineNum) { int iCount; // Insert "LineNum" blank lines. for(iCount = 1; iCount<=LineNum; iCount++) { wrdApp.Selection.TypeParagraph(); } } private void FillRow(Word._Document oDoc, int Row, string Text1, string Text2, string Text3, string Text4) { // Insert the data into the specific cell. oDoc.Tables[1].Cell(Row,1).Range.InsertAfter(Text1); oDoc.Tables[1].Cell(Row,2).Range.InsertAfter(Text2); oDoc.Tables[1].Cell(Row,3).Range.InsertAfter(Text3); oDoc.Tables[1].Cell(Row,4).Range.InsertAfter(Text4); } private void CreateMailMergeDataFile() { Word._Document oDataDoc; int iCount; Object oName = "C:\\DataDoc.doc"; Object oHeader = "FirstName, LastName, Address, CityStateZip"; wrdDoc.MailMerge.CreateDataSource(ref oName,ref oMissing, ref oMissing,ref oHeader, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing); // Open the file to insert data. oDataDoc = wrdApp.Documents.Open(ref oName,ref oMissing, ref oMissing, ref oMissing,ref oMissing,ref oMissing, ref oMissing,ref oMissing,ref oMissing,ref oMissing, ref oMissing,ref oMissing,ref oMissing,ref oMissing, ref oMissing/*, ref oMissing */); for (iCount=1; iCount<=2; iCount++) { oDataDoc.Tables[1].Rows.Add(ref oMissing); } // Fill in the data. FillRow(oDataDoc, 2, "Steve", "DeBroux", "4567 Main Street", "Buffalo, NY 98052"); FillRow(oDataDoc, 3, "Jan", "Miksovsky", "1234 5th Street", "Charlotte, NC 98765"); FillRow(oDataDoc, 4, "Brian", "Valentine", "12348 78th Street Apt. 214", "Lubbock, TX 25874"); // Save and close the file. oDataDoc.Save(); oDataDoc.Close(ref oFalse, ref oMissing, ref oMissing); } private void button1_Click(object sender, System.EventArgs e) { Word.Selection wrdSelection; Word.MailMerge wrdMailMerge; Word.MailMergeFields wrdMergeFields; Word.Table wrdTable; string StrToAdd; // Create an instance of Word and make it visible. wrdApp = new Word.Application(); wrdApp.Visible = true; // Add a new document. wrdDoc = wrdApp.Documents.Add(ref oMissing,ref oMissing, ref oMissing,ref oMissing); wrdDoc.Select(); wrdSelection = wrdApp.Selection; wrdMailMerge = wrdDoc.MailMerge; // Create a MailMerge Data file. CreateMailMergeDataFile(); // Create a string and insert it into the document. StrToAdd = "State University\r\nElectrical Engineering Department"; wrdSelection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; wrdSelection.TypeText(StrToAdd); InsertLines(4); // Insert merge data. wrdSelection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; wrdMergeFields = wrdMailMerge.Fields; wrdMergeFields.Add(wrdSelection.Range, "FirstName"); wrdSelection.TypeText(" "); wrdMergeFields.Add(wrdSelection.Range, "LastName"); wrdSelection.TypeParagraph(); wrdMergeFields.Add(wrdSelection.Range, "Address"); wrdSelection.TypeParagraph(); wrdMergeFields.Add(wrdSelection.Range, "CityStateZip"); InsertLines(2); // Right justify the line and insert a date field // with the current date. wrdSelection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight; Object objDate = "dddd, MMMM dd, yyyy"; wrdSelection.InsertDateTime(ref objDate,ref oFalse,ref oMissing, ref oMissing, ref oMissing); InsertLines(2); // Justify the rest of the document. wrdSelection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphJustify; wrdSelection.TypeText("Dear "); wrdMergeFields.Add(wrdSelection.Range, "FirstName"); wrdSelection.TypeText(","); InsertLines(2); // Create a string and insert it into the document. StrToAdd = "Thank you for your recent request for next " + "semester's class schedule for the Electrical " + "Engineering Department. Enclosed with this " + "letter is a booklet containing all the classes " + "offered next semester at State University. " + "Several new classes will be offered in the " + "Electrical Engineering Department next semester. " + "These classes are listed below."; wrdSelection.TypeText(StrToAdd); InsertLines(2); // Insert a new table with 9 rows and 4 columns. wrdTable = wrdDoc.Tables.Add(wrdSelection.Range,9,4, ref oMissing, ref oMissing); // Set the column widths. wrdTable.Columns[1].SetWidth(51, Word.WdRulerStyle.wdAdjustNone); wrdTable.Columns[2].SetWidth(170, Word.WdRulerStyle.wdAdjustNone); wrdTable.Columns[3].SetWidth(100, Word.WdRulerStyle.wdAdjustNone); wrdTable.Columns[4].SetWidth(111, Word.WdRulerStyle.wdAdjustNone); // Set the shading on the first row to light gray. wrdTable.Rows[1].Cells.Shading.BackgroundPatternColorIndex = Word.WdColorIndex.wdGray25; // Bold the first row. wrdTable.Rows[1].Range.Bold = 1; // Center the text in Cell (1,1). wrdTable.Cell(1, 1).Range.Paragraphs.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; // Fill each row of the table with data. FillRow(wrdDoc, 1, "Class Number", "Class Name", "Class Time", "Instructor"); FillRow(wrdDoc, 2, "EE220", "Introduction to Electronics II", "1:00-2:00 M,W,F", "Dr. Jensen"); FillRow(wrdDoc, 3, "EE230", "Electromagnetic Field Theory I", "10:00-11:30 T,T", "Dr. Crump"); FillRow( wrdDoc, 4, "EE300", "Feedback Control Systems", "9:00-10:00 M,W,F", "Dr. Murdy"); FillRow(wrdDoc, 5, "EE325", "Advanced Digital Design", "9:00-10:30 T,T", "Dr. Alley"); FillRow(wrdDoc, 6, "EE350", "Advanced Communication Systems", "9:00-10:30 T,T", "Dr. Taylor"); FillRow(wrdDoc, 7, "EE400", "Advanced Microwave Theory", "1:00-2:30 T,T", "Dr. Lee"); FillRow(wrdDoc, 8, "EE450", "Plasma Theory", "1:00-2:00 M,W,F", "Dr. Davis"); FillRow(wrdDoc, 9, "EE500", "Principles of VLSI Design", "3:00-4:00 M,W,F", "Dr. Ellison"); // Go to the end of the document. Object oConst1 = Word.WdGoToItem.wdGoToLine; Object oConst2 = Word.WdGoToDirection.wdGoToLast; wrdApp.Selection.GoTo(ref oConst1,ref oConst2,ref oMissing,ref oMissing); InsertLines(2); // Create a string and insert it into the document. StrToAdd = "For additional information regarding the " + "Department of Electrical Engineering, " + "you can visit our Web site at "; wrdSelection.TypeText(StrToAdd); // Insert a hyperlink to the Web page. Object oAddress = "http://www.ee.stateu.tld"; Object oRange = wrdSelection.Range; wrdSelection.Hyperlinks.Add(oRange, ref oAddress,ref oMissing, ref oMissing, ref oMissing, ref oMissing); // Create a string and insert it into the document StrToAdd = ". Thank you for your interest in the classes " + "offered in the Department of Electrical " + "Engineering. If you have any other questions, " + "please feel free to give us a call at " + "555-1212.\r\n\r\n" + "Sincerely,\r\n\r\n" + "Kathryn M. Hinsch\r\n" + "Department of Electrical Engineering \r\n"; wrdSelection.TypeText(StrToAdd); // Perform mail merge. wrdMailMerge.Destination = Word.WdMailMergeDestination.wdSendToNewDocument; wrdMailMerge.Execute(ref oFalse); // Close the original form document. wrdDoc.Saved = true; wrdDoc.Close(ref oFalse,ref oMissing,ref oMissing); // Release References. wrdSelection = null; wrdMailMerge = null; wrdMergeFields = null; wrdDoc = null; wrdApp = null; // Clean up temp file. System.IO.File.Delete("C:\\DataDoc.doc"); }
注意 您必須在 Visual Studio 2005 中變更程式碼。 根據預設,當您建立Windows Forms專案時,Visual C# 會將一個表單新增至專案。 表單名為 Form1。 代表表單的兩個檔案名為 Form1.cs 和 Form1.designer.cs。 您可以在 Form1.cs 中撰寫程式碼。 Form1.designer.cs 檔案是 Windows Forms Designer 撰寫程式碼的位置,該程式碼會實作您從 [工具箱] 拖放控制項所執行的所有動作。
如需 Visual C# 2005 中Windows Forms設計工具的詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站:建立專案 (Visual C#) 注意 Microsoft Office Word 2003 具有檔 Open 方法的其他引數。 如果您使用 Word 2003 PIA,請移除 Open 方法之額外參數的批註標記法。
將下列內容新增至 Form1.cs 的頂端:
using Word = Microsoft.Office.Interop.Word;
按 F5 建置 並執行程式。
按一下 Button1 以啟動 Word Automation 並執行合併列印。
參考
如需詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站:使用 Visual Studio 進行 Microsoft Office 開發與 Visual Studio 的 Microsoft Office 開發
如需詳細資訊,請按一下下列文章編號以檢視 Microsoft 知識庫中的文章:
285332 如何使用 Visual Basic 自動化 Word 2002 以建立合併列印