Share via


如何自動化 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。

建置自動化範例

  1. 啟動 Microsoft Visual Studio 2005 或 Microsoft Visual Studio .NET。

  2. 在 [檔案] 功能表上,按一下 [新增],然後按一下 [專案]。 從 Visual C# 專案類型中選取 [Windows 應用程式]。 根據預設,會建立 Form1。

  3. 在 Visual Studio 2005 中新增 Microsoft Word 11.0 物件程式庫 或 Visual Studio .NET 中 Microsoft Word 物件程式庫的參考。 如果要執行這項操作,請依照下列步驟執行:

    1. 按一下 [專案] 功能表上的 [加入參考]。

    2. 在 [COM] 索引標籤上,找出 [Microsoft Word 物件程式庫],然後按一下 [選取]。

      在 Visual Studio 2005 中,于[COM] 索引標籤上找出[Microsoft Word 11.0 物件程式庫]。

      注意 Microsoft Office 2003 包含主要 Interop 元件 (PIA) 。 Microsoft Office XP 不包含 PIA,但可以下載。

    3. 按一下 [新增參考] 對話方塊中的 [確定] 以接受您的選擇。

  4. 在 [檢視] 功能表上,選取 [工具箱] 以顯示工具箱,然後將按鈕新增至 Form1。

  5. 按兩下 Button1。 表單的程式碼視窗隨即出現。

  6. 在程式碼視窗中,取代下列程式碼

      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 方法之額外參數的批註標記法。

  7. 將下列內容新增至 Form1.cs 的頂端:

    using Word = Microsoft.Office.Interop.Word;
    
    
  8. 按 F5 建置 並執行程式。

  9. 按一下 Button1 以啟動 Word Automation 並執行合併列印。

參考

如需詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站:使用 Visual Studio 進行 Microsoft Office 開發與 Visual Studio 的 Microsoft Office 開發

如需詳細資訊,請按一下下列文章編號以檢視 Microsoft 知識庫中的文章:

285332 如何使用 Visual Basic 自動化 Word 2002 以建立合併列印