Microsoft KB Archive/220911

From BetaArchive Wiki

Article ID: 220911

Article Last Modified on 5/14/2007



APPLIES TO

  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++ 6.0 Standard Edition
  • Microsoft Office Word 2007
  • Microsoft Office Word 2003
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition



This article was previously published under Q220911

SUMMARY

This article demonstrates how to create and manipulate a Microsoft Word document using Automation from Microsoft Visual C++ and Microsoft Foundation Classes (MFC).

MORE INFORMATION

This article parallels a Microsoft Knowledge Base article that describes the same process using Microsoft Visual Basic. For more information about automation of Word from Visual Basic, click the following article number to view the article in the Microsoft Knowledge Base:

220607 How to automate Microsoft Word to perform mail merge from Visual Basic


Building the automation sample

  1. Follow steps 1 through 12 in the following Microsoft Knowledge Base article:

    178749 How to create an automation project using MFC and a type library

    Note In step 9, choose the correct type library for the version of Word you are automating. See the references section below for information on finding the correctly type library.
  2. Add the include statement for the header file that was created above (either msword8.h, msword9.h or msword.h) in AutoProjectDlg.cpp after the include statement for stdafx.h. An example for Word 97 would be:

       #include "stdafx.h"
       #include "msword8.h"
                        
  3. Add Automation code to the CAutoProjectDlg::OnRun method so that it appears as shown below:

    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. Insert the following code above in the code that is given in step 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. Compile and run your program. Click the Run button, and Microsoft Word should start and display a sample letter. Note that some methods have changed with Word 2000 and Word 2002. For more information on these changes, see the "References" section.


REFERENCES

Notes for automating Microsoft Word 2000 and Microsoft Word 2002

Some methods and properties have changed for Microsoft Word 2000 and Microsoft Word 2002. For more information about how to use the sample code in this article together with the Word type library, click the following article number to view the article in the Microsoft Knowledge Base:

224925 Type libraries for Office may change with new release


For more information about Office Automation, visit the Microsoft Office Development support site at:


Additional query words: WD2003 WD2007

Keywords: kbautomation kbhowto KB220911