HOW TO:在 Visual C# .NET 中使 Microsoft Word 自动运行以执行邮件合并 (From MSDN)

有关本文的 Microsoft Visual Basic .NET 版本,请参阅 301656。 有关本文的 Microsoft Visual Basic 6.0 和 Microsoft Visual Basic 5.0 版本,请参阅 220607

概要

本文阐述如何使用 Microsoft Visual C# .NET 来使 Word 自动运行以创建合并邮件的文档。

更多信息

通过自动化过程,使用诸如 Visual C# .NET 这样的语言编写的应用程序就可以用编程方式来控制其他应用程序。利用 Microsoft Word 的自动化功能,您可以执行诸如新建文档、向文档添加文本以及对文档进行格式设置等操作。对于 Word 和其他 Microsoft Office 应用程序,几乎所有可以通过用户界面手动执行的操作也都可以通过使用“自动化”功能以编程方式来执行。

Word 通过一种对象模型来公开这一程序功能。该对象模型是一些类和方法的集合,这些类和方法充当 Word 的逻辑组件。例如,有 Application 对象、 Document 对象和 Paragraph 对象,其中每一种对象都包含 Word 中那些组件的功能。要从 Visual C# .NET 访问该对象模型,可以设置对类型库的项目引用。

本文将阐述如何为 Visual C# .NET 设置对 Word 类型库的适当项目引用,并提供使 Word 自动运行的代码示例。

生成自动化示例

  1. 启动 Microsoft Visual Studio .NET。
  2. 文件菜单上,单击新建,然后单击项目。从 Visual C# 项目类型中选择 Windows 应用程序。默认情况下会创建 Form1。
  3. 添加对 Microsoft Word 对象库的引用。为此,请按照下列步骤操作:
    1. 项目菜单上,单击添加引用
    2. COM 选项卡上,找到 Microsoft Word 对象库,然后单击选择

      注意:Microsoft Office 2003 包含主 Interop 程序集 (PIA)。Microsoft Office XP 不包含 PIA,但您可以下载 PIA。 有关 Office XP PIA 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      328912 INFO: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");
    } 
    					
    注意:Microsfot Office Word 2003 为文档的 Open 方法提供了一个附加参数。Èç¹ûÄúʹÓõÄÊÇ Word 2003 PIA£¬Çëɾ³ý¶Ô Open ·½·¨µÄ¸½¼Ó²ÎÊýËù×öµÄ×¢ÊÍ¡£
  7. ½«ÒÔÏ´úÂëÌí¼Óµ½ Form1.cs µÄ¶¥²¿£º
    using Word = Microsoft.Office.Interop.Word;
    					
  8. 按 F5 键生成并运行该程序。
  9. 单击 Button1 以启动 Word 自动化功能并执行邮件合并。

参考

有关更多信息,请访问下面的 Microsoft Developer Network (MSDN) Web 站点:

Microsoft Office Development with Visual Studio(使用 Visual Studio 进行 Microsoft Office 开发)
http://msdn.microsoft.com/library/en-us/dnoffdev/html/vsofficedev.asp

有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

285332 HOWTO:Automate Word 2002 with Visual Basic to Create a Mail Merge

这篇文章中的信息适用于:

  • Microsoft Visual C# .NET (2003)
  • Microsoft Visual C# .NET (2002)
  • Microsoft Office Word 2003
  • Microsoft Word 2002
最近更新:2004-2-13 (5.0)
关键字:kbPIA kbAutomation kbhowto KB301659
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值