如何自动执行 Microsoft Word 执行邮件合并使用 Visual c + + 和 MFC

文章翻译 文章翻译
文章编号: 220911 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文演示如何创建和操作使用从 Microsoft Visual c + + 和 Microsoft 基础类 (MFC) 的自动化功能的 Word 文档。

更多信息

这篇文章并行描述的相同过程使用 Microsoft Visual Basic 在 Microsoft 知识库文章。有关从 Visual Basic 的 Word 的自动化的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
220607如何自动执行 Microsoft Word,使其以从 Visual Basic 中执行邮件合并

生成自动化示例

  1. 请按照步骤 1 到 12 中下面的 Microsoft 知识库文章:
    178749如何创建自动化项目使用 MFC 和类型库
    注意在步骤 9,选择正确的类型库中的您的 Word 版本。在 $ 查找上,请参阅下面的引用部分有关的信息,以在正确类型库。
  2. 包含语句的 stdafx.h 文件后,在 $ AutoProjectDlg.cpp 中添加 包含 语句 (msword8.h、 msword9.h 或 msword.h) 创建的头文件。为 Word 97 的一个例子是:
       #include "stdafx.h"
       #include "msword8.h"
    					
  3. 将自动化代码添加到 CAutoProjectDlg::OnRun 方法,以使其显示,如下所示:
    void CAutoProjectDlg::OnRun()
    {
    	_Application oWord;
    	Documents oDocs;
    	_Document oDoc;
    	Selection oSelection;
    	Paragraphs oParagraphs;
    	Tables oTables;
    	Table oTable;
    	Range oRange;
    	Columns oColumns;
    	Column oColumn;
    	Rows oRows;
    	Row oRow;
    
    	Cells oCells;
    	Cell oCell; 
    	Shading oShading;
    	Hyperlinks oHyperlinks;
    	MailMerge oMailMerge;
    	MailMergeFields oMailMergeFields;
    	COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR),
    		        vtTrue((short)TRUE),
    				vtFalse((short)FALSE);
    	CString StrToAdd;
    
    	// Create an instance of Word
    	if (!oWord.CreateDispatch("Word.Application")) {
    		AfxMessageBox("Word failed to start!");
    	} else {
    	// Set the visible property
    	oWord.SetVisible(TRUE);
    	// Add a new document
    	oDocs = oWord.GetDocuments();
    	oDoc = oDocs.Add(vtOptional,vtOptional);
    
    	CreateMailMergeDataFile(&oWord,&oDoc);
    	// Add the address header
    
    	StrToAdd = "State University\r\nElectrical Engineering " \ 
    		       "Department";
    	oSelection = oWord.GetSelection();
    
    	oParagraphs = oSelection.GetParagraphs();
    	oParagraphs.SetAlignment(1);  // 1 = wdAlignParagraphCenter  
    	oSelection.TypeText(StrToAdd);
    
    	InsertLines(&oSelection,4);
    
    	oParagraphs.SetAlignment(0);  // 0 = wdAlignParagraphLeft
    	oMailMerge = oDoc.GetMailMerge();
    	oMailMergeFields = oMailMerge.GetFields();
    	oMailMergeFields.Add(oSelection.GetRange(),"FirstName");
    	oSelection.TypeText(" ");
    	oMailMergeFields.Add(oSelection.GetRange(),"LastName");
    	oSelection.TypeParagraph();
    	oMailMergeFields.Add(oSelection.GetRange(),"Address");
    	oSelection.TypeParagraph();
    	oMailMergeFields.Add(oSelection.GetRange(),"CityStateZip");
    
    	InsertLines(&oSelection,4);
    	// Set the paragraph alignment to Right justified
    	oParagraphs = oSelection.GetParagraphs();
    
    	oParagraphs.SetAlignment(2);  // 2 = wdAlignParagraphRight
    	// Insert the current date
    	oSelection.InsertDateTime(COleVariant("dddd, MMMM dd, yyyy"),\ 
    		 vtFalse,vtOptional);
    
    	InsertLines(&oSelection,2);
    
    	// Reset the justification to Justify
    
    	oParagraphs = oSelection.GetParagraphs();
    	oParagraphs.SetAlignment(3);  // 3 = wdAlignParagraphJustify
    
    	oSelection.TypeText("Dear ");
    	oMailMergeFields.Add(oSelection.GetRange(),"FirstName");
    	oSelection.TypeText(",");
    
    	InsertLines(&oSelection,2);
    
    	// Add the body of the message
    	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.";
    	oSelection.TypeText(StrToAdd);
    
    	InsertLines(&oSelection,2);
    	
    	// Add a new table with 9 rows and 4 columns
    	oRange = oSelection.GetRange();
    	oTables = oDoc.GetTables();
    	oTable = oTables.Add(oRange,9,4);
    
    	// Set the width of each column
    	oColumns = oTable.GetColumns();
    	oColumn = oColumns.Item(1);
    	oColumn.SetWidth(51.0,0);  // 0 = wdAdjustNone
    	oColumn = oColumns.Item(2);
    	oColumn.SetWidth(198.0,0);  // 0 = wdAdjustNone
    	oColumn = oColumns.Item(3);
    	oColumn.SetWidth(100.0,0);  // 0 = wdAdjustNone
    	oColumn = oColumns.Item(4);
    	oColumn.SetWidth(111.0,0);  // 0 = wdAdjustNone
    
    	// Set the shading for row 1 to wdGray25
    	oRows = oTable.GetRows();
    	oRow = oRows.Item(1);
    	oCells = oRow.GetCells();
    	oShading = oCells.GetShading();
    	oShading.SetBackgroundPatternColorIndex(16); // 16 = wdGray25
    
    	// Turn on BOLD for the first row
    	oRange = oRow.GetRange();
    	oRange.SetBold(TRUE);
    
    	// Set the alignment for cell (1,1) to center
    	oCell = oTable.Cell(1,1);
    	oRange = oCell.GetRange();
    	oParagraphs = oRange.GetParagraphs();
    	oParagraphs.SetAlignment(1);  // 1 = wdAlignParagraphCenter
    
    	// Fill in the class schedule data
    	FillRow(&oTable,1,"Class Number","Class Name",\ 
    		"Class Time","Instructor");	
    	FillRow(&oTable,2, "EE220", "Introduction to Electronics II", \ 
    		"1:00-2:00 M,W,F", "Dr. Jensen");
    	FillRow(&oTable,3, "EE230", "Electromagnetic Field Theory I", \ 
    		"10:00-11:30 T,T", "Dr. Crump");
    	FillRow(&oTable,4, "EE300", "Feedback Control Systems", \ 
    		"9:00-10:00 M,W,F", "Dr. Murdy");
    	FillRow(&oTable,5, "EE325", "Advanced Digital Design", \ 
    		"9:00-10:30 T,T", "Dr. Alley");
    	FillRow(&oTable,6, "EE350", "Advanced Communication Systems", \ 
    		"9:00-10:30 T,T", "Dr. Taylor");
    	FillRow(&oTable,7, "EE400", "Advanced Microwave Theory", \ 
    		"1:00-2:30 T,T", "Dr. Lee");
    	FillRow(&oTable,8, "EE450", "Plasma Theory", \ 
    		"1:00-2:00 M,W,F", "Dr. Davis");
    	FillRow(&oTable,9, "EE500", "Principles of VLSI Design", \ 
    		"3:00-4:00 M,W,F", "Dr. Ellison");
    
    	// Go to the end of the document
    	oSelection.GoTo(COleVariant((short)3), // 3 = wdGoToLine
    	COleVariant((short)-1),vtOptional,vtOptional);  // -1 = wdGoToLast
    
    	InsertLines(&oSelection,2);
    
    	// Add closing text
    	StrToAdd = "For additional information regarding the " \ 
                 "Department of Electrical Engineering, " \ 
                 "you can visit our website at ";
    	oSelection.TypeText(StrToAdd);
    
    	// Add a hyperlink to the homepage
    	oHyperlinks = oSelection.GetHyperlinks();
    	oHyperlinks.Add(oSelection.GetRange(),\ 
    		COleVariant("http://www.ee.stateu.tld"),vtOptional);
    
    	// Finish adding closing text
    	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 (999) " \ 
                 "555-1212.\r\n\r\n" \ 
                 "Sincerely,\r\n\r\n" \ 
                 "Kathryn M. Hinsch\r\n" \ 
                 "Department of Electrical Engineering\r\n";
    	oSelection.TypeText(StrToAdd);
    
    	// Perform mail merge
    	oMailMerge.SetDestination(0); // 0 = wdSendToNewDocument
    	oMailMerge.Execute(vtFalse);
    
    	// Close the original form document
    	oDoc.SetSaved(TRUE);
    	oDoc.Close(vtFalse,vtOptional,vtOptional);
      
    	}
    }
    					
  4. 将以下代码上方插入指定的代码中在第 3 步:
    void InsertLines(Selection *pSelection, int NumLines)
    {
    	int iCount;
    
    	// Insert NumLines blank lines
    	for (iCount = 1; iCount <= NumLines; iCount++)
    		pSelection->TypeParagraph();
    }
    
    void FillRow(Table *pTable,int Row, CString Text1, 
    			 CString Text2, CString Text3, CString Text4)
    {
    	Cell oCell;
    	Range oRange;
    
    	// Insert data into the specific cell
    	oCell = pTable->Cell(Row,1);
    	oRange = oCell.GetRange();
    	oRange.InsertAfter(Text1);
    	oCell = pTable->Cell(Row,2);
    	oRange = oCell.GetRange();
    	oRange.InsertAfter(Text2);
    	oCell = pTable->Cell(Row,3);
    	oRange = oCell.GetRange();
    	oRange.InsertAfter(Text3);
    	oCell = pTable->Cell(Row,4);
    	oRange = oCell.GetRange();
    	oRange.InsertAfter(Text4);
    
    }
    
    void CreateMailMergeDataFile(_Application *pApp,_Document *pDoc)
    {
      _Document oDataDoc;
      MailMerge oMailMerge;
      Documents oDocs;
      Tables oTables;
      Table oTable;
      Rows oRows;
      int iCount;
      COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR),
    				vtFalse((short)FALSE);
      
      // Create a data source at C:\DataDoc.doc containing the field data
      oMailMerge = pDoc->GetMailMerge();
      oMailMerge.CreateDataSource(COleVariant("C:\\DataDoc.doc"), \ 
            vtOptional,vtOptional, \ 
            COleVariant("FirstName, LastName, Address,CityStateZip"),\ 
            vtOptional, vtOptional,vtOptional,vtOptional,vtOptional);
      // Open the file to insert data
      oDocs = pApp->GetDocuments();
      oDataDoc = oDocs.Open(COleVariant("C:\\DataDoc.doc"), \ 
           vtOptional,vtOptional,vtOptional,vtOptional,\ 
           vtOptional,vtOptional,vtOptional,vtOptional,\ 
           vtOptional);
      oTables = oDataDoc.GetTables();
      oTable = oTables.Item(1);
      oRows = oTable.GetRows();
      for (iCount=1; iCount<=2; iCount++)  
        oRows.Add(vtOptional);
    
      // Fill in the data
      FillRow(&oTable, 2, "Steve", "DeBroux", \ 
            "4567 Main Street", "Buffalo, NY  98052");
      FillRow(&oTable, 3, "Jan", "Miksovsky", \ 
            "1234 5th Street", "Charlotte, NC  98765");
      FillRow(&oTable, 4, "Brian", "Valentine", \ 
            "12348 78th Street  Apt. 214", "Lubbock, TX  25874");
      // Save and close the file
      oDataDoc.Save();
      oDataDoc.Close(vtFalse,vtOptional,vtOptional);
    }
    					
  5. 编译并运行您的程序。单击 运行 按钮,Microsoft Word 应该开始和显示示例字母。请注意某些方法具有与 Word 2000 和 Word 2002 更改。有关这些更改的详细信息,请参阅"参考"部分。

参考

自动执行 Microsoft Word 2000 和 Microsoft Word 2002 的备注

某些方法和属性已更改为 Microsoft Word 2000 和 Microsoft Word 2002 中。有关如何在这篇文章中与 Word 类型库一起使用的代码示例的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
224925为 Office 类型库可能会更改与新版本
有关 Office 自动化的详细信息,请访问 Microsoft Office 开发支持网站,网址:
http://support.microsoft.com/ofd

属性

文章编号: 220911 - 最后修改: 2007年5月14日 - 修订: 3.2
这篇文章中的信息适用于:
  • Microsoft Visual C++ 5.0 企业版
  • Microsoft Visual C++ 6.0 企业版
  • Microsoft Visual C++ 5.0 专业版
  • Microsoft Visual C++ 6.0 专业版
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Office Word 2007
  • Microsoft Office Word 2003
  • Microsoft Word 2002 标准版
  • Microsoft Word 2000 标准版
  • Microsoft Word 97 标准版
关键字:?
kbmt kbautomation kbhowto KB220911 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 220911
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com