Jak zautomatyzować program Microsoft Word do wykonywania korespondencji seryjnej przy użyciu języków Visual C++ i MFC

Podsumowanie

W tym artykule przedstawiono sposób tworzenia dokumentu programu Microsoft Word i manipulowania nimi przy użyciu usługi Automation z Microsoft Visual C++ i klas Microsoft Foundation Classes (MFC).

Więcej informacji

Ten artykuł jest równoległy do artykułu z bazy wiedzy Microsoft Knowledge Base, który opisuje ten sam proces przy użyciu programu Microsoft Visual Basic.

Tworzenie przykładu automatyzacji

  1. Za pomocą programu Microsoft Developer Studio uruchom nowy projekt "MFC AppWizard (exe)" o nazwie "AutoProjekt".

  2. W kroku 1 aplikacji MFC AppWizard wybierz pozycję "Oparte na oknie dialogowym" dla typu aplikacji, a następnie kliknij przycisk Zakończ.

    Zostanie wyświetlone okno dialogowe Nowe informacje o projekcie i wskazuje, że klasy, które mają zostać utworzone, obejmują:

    Application: CAutoProjectApp in AutoProject.h and AutoProject.cpp
    Dialog: CAutoProjectDlg in AutoProject.h and AutoProjectDlg.cpp
    

    Kliknij przycisk OK, aby utworzyć projekt.

  3. Okno dialogowe "IDD_AUTOPROJECT_DIALOG" zostanie otwarte w obszarze projektowania/edycji programu Visual Studio. Zmodyfikuj go zgodnie z instrukcjami w kolejnych dwóch krokach.

  4. Usuń kontrolkę Etykieta (IDC_STATIC) i przycisk Anuluj (IDCANCEL).

  5. Zmień nazwę przycisku OK na "IDRUN", a podpis na "Uruchom". Zamknij formularz projektu okna dialogowego AutoProject.rc.

  6. Kliknij pozycję ClassWizard w menu Widok (lub naciśnij klawisze CTRL+W).

  7. Wybierz kartę Mapy komunikatów. Wybierz pozycję IDRUN w polu listy Identyfikatory obiektów i wybierz pozycję "BN_CLICKED" w polu Lista komunikatów. Kliknij pozycję Dodaj funkcję i zaakceptuj nazwę funkcji "OnRun". Kliknij przycisk OK, aby zamknąć klasę ClassWizard.

    UWAGA:** Ten krok dodaje deklarację dla elementu członkowskiego funkcji "OnRun();" do pliku nagłówka o nazwie AutoProjectDLG.h. Ten krok dodaje również pustą funkcję obsługi komunikatów szkieletu o nazwie CAutoProjectDlg::OnRun() do pliku o nazwie AutoProjectDLG.cpp.

  8. Kliknij pozycję ClassWizard w menu Widok (lub naciśnij klawisze CTRL+W).

  9. Wybierz kartę Automatyzacja. Kliknij pozycję Dodaj klasę i wybierz pozycję "Z biblioteki typów". Przejdź do biblioteki obiektów dla aplikacji, którą chcesz zautomatyzować (w tym przykładzie, jeśli automatyzujesz program Excel 97, wybierz bibliotekę obiektów programu Microsoft Excel 8.0; domyślną lokalizacją jest C:\Program Files\Microsoft Office\Office\Excel8.olb).

    Jeśli automatyzujesz program Microsoft Excel 2000, wybierz bibliotekę obiektów programu Microsoft Excel 9.0, dla której domyślną lokalizacją jest C:\Program Files\Microsoft Office\Office\Excel9.olb.

    Jeśli automatyzujesz programy Microsoft Excel 2002 i Microsoft Office Excel 2003, biblioteka obiektów jest osadzona w pliku Excel.exe. Domyślną lokalizacją Excel.exe w pakiecie Office 2002 jest C:\program Files\Microsoft Office\Office10\Excel.exe. Domyślną lokalizacją dla Excel.exe w pakiecie Office 2003 jest C:\program Files\Microsoft Office\Office11\Excel.exe. Po wybraniu odpowiedniej biblioteki obiektów kliknij przycisk Otwórz. Wybierz wszystkie klasy na liście Potwierdź klasy, a następnie kliknij przycisk OK.

    UWAGA Pole listy w oknie dialogowym Potwierdzanie klas zawiera wszystkie interfejsy IDispatch (które są praktycznie identyczne z klasami) w bibliotece typów programu Microsoft Excel. W dolnej połowie okna dialogowego zobaczysz, że plik implementacji o nazwie Excel8.cpp zawiera wygenerowane otoki klas pochodzące z aplikacji ColeDispatchDriver(), a odpowiedni plik nagłówka deklaracji nosi nazwę Excel8.h. (W programach Excel 2002 i Excel 2003 pliki mają nazwy Excel.cpp i Excel.h).

    Uwaga Wybierz odpowiednią bibliotekę typów dla zautomatyzowanej wersji programu Word. Zapoznaj się z sekcją odwołań poniżej, aby uzyskać informacje na temat znajdowania biblioteki poprawnie typów.

  10. Kliknij przycisk OK, aby zamknąć okno dialogowe MFC ClassWizard.

  11. Dodaj następujący kod do funkcji CAutoProjectApp::InitInstance(), która ładuje i włącza bibliotekę usług COM:

    BOOL CAutoProjectApp::InitInstance()
      {
         if(!AfxOleInit())  // Your addition starts here
         {
            AfxMessageBox("Could not initialize COM dll");
            return FALSE;
         }                 // End of your addition
    
         AfxEnableControlContainer();
      .
      .
      .
    
      }
    
  12. Dodaj następujący wiersz do instrukcji #include w górnej części pliku programu AutoProject.cpp:

      #include <afxdisp.h>
    
  13. Dodaj instrukcję include dla pliku nagłówka utworzonego powyżej (msword8.h, msword9.h lub msword.h) w pliku AutoProjectDlg.cpp po instrukcji include dla stdafx.h. Przykład dla programu Word 97 to:

       #include "stdafx.h"
       #include "msword8.h"
    
    
  14. Dodaj kod usługi Automation do metody CAutoProjectDlg::OnRun, aby był wyświetlany jak pokazano poniżej:

    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);
    
    }
    }
    
    
  15. Wstaw następujący kod powyżej w kodzie podanym w kroku 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);
    }
    
    
  16. Skompiluj i uruchom program. Kliknij przycisk Uruchom , a program Microsoft Word powinien uruchomić i wyświetlić przykładową literę. Należy pamiętać, że niektóre metody uległy zmianie w programach Word 2000 i Word 2002. Aby uzyskać więcej informacji na temat tych zmian, zobacz sekcję "Odwołania".

Informacje

Uwagi dotyczące automatyzowania programów Microsoft Word 2000 i Microsoft Word 2002

Niektóre metody i właściwości zostały zmienione dla programów Microsoft Word 2000 i Microsoft Word 2002.

Aby uzyskać więcej informacji na temat usługi Office Automation, odwiedź witrynę pomocy technicznej programu Microsoft Office Development pod adresem: pomoc techniczna firmy Microsoft