Come automatizzare Microsoft Word per eseguire una stampa unione con Visual C++ e MFC

Riepilogo

Questo articolo illustra come creare e modificare un documento di Microsoft Word usando Automazione da Microsoft Visual C++ e Microsoft Foundation Classes (MFC).

Ulteriori informazioni

Questo articolo è parallelo a un articolo della Microsoft Knowledge Base che descrive lo stesso processo usando Microsoft Visual Basic.

Compilazione dell'esempio di automazione

  1. Con Microsoft Developer Studio avviare un nuovo progetto "MFC AppWizard (exe)" denominato "AutoProject".

  2. Nel passaggio 1 della creazione guidata app MFC scegliere "Dialog Based" per il tipo di applicazione e quindi fare clic su Fine.

    Verrà visualizzata la finestra di dialogo Nuove informazioni sul progetto che indica che le classi da creare includono:

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

    Fare clic su OK per creare il progetto.

  3. La finestra di dialogo "IDD_AUTOPROJECT_DIALOG" viene visualizzata nell'area di progettazione/modifica di Visual Studio. Modificarlo in base alle istruzioni nei due passaggi successivi.

  4. Rimuovere il controllo Label (IDC_STATIC) e il pulsante Cancel (IDCANCEL).

  5. Modificare il nome del pulsante OK in "IDRUN" e la didascalia in "Esegui". Chiudere il modulo di progettazione della finestra di dialogo AutoProject.rc.

  6. Fare clic su ClassWizard dal menu Visualizza o premere CTRL+W.

  7. Selezionare la scheda Mappe messaggi. Selezionare IDRUN nella casella di riepilogo ID oggetto e selezionare "BN_CLICKED" nella casella di riepilogo Messaggi. Fare clic su Aggiungi funzione e accettare il nome della funzione "OnRun". Fare clic su OK per chiudere classwizard.

    NOTA:** Questo passaggio aggiunge una dichiarazione per il membro della funzione "OnRun();" al file di intestazione denominato AutoProjectDLG.h. Questo passaggio aggiunge anche una funzione del gestore di messaggi scheletro vuota denominata CAutoProjectDlg::OnRun() al file denominato AutoProjectDLG.cpp.

  8. Fare clic su ClassWizard dal menu Visualizza o premere CTRL+W.

  9. Selezionare la scheda Automazione. Fare clic su Aggiungi classe e scegliere "Da una libreria dei tipi". Passare a selezionare la libreria di oggetti per l'applicazione da automatizzare. Per questo esempio, se si automatizza Excel 97, scegliere la libreria di oggetti di Microsoft Excel 8.0. Il percorso predefinito è C:\Programmi\Microsoft Office\Office\Excel8.olb.

    Se si automatizza Microsoft Excel 2000, scegliere Libreria oggetti di Microsoft Excel 9.0 per cui il percorso predefinito è C:\Programmi\Microsoft Office\Office\Excel9.olb.

    Se si automatizza Microsoft Excel 2002 e Microsoft Office Excel 2003, la libreria di oggetti viene incorporata nel file Excel.exe. Il percorso predefinito per Excel.exe in Office 2002 è C:\programmi\Microsoft Office\Office10\Excel.exe. Il percorso predefinito per Excel.exe in Office 2003 è C:\programmi\Microsoft Office\Office11\Excel.exe. Dopo aver selezionato la libreria di oggetti appropriata, fare clic su Apri. Selezionare tutte le classi nell'elenco Conferma classi e quindi fare clic su OK.

    NOTA La casella di riepilogo nella finestra di dialogo Conferma classi contiene tutte le interfacce IDispatch , praticamente identiche alle classi, nella libreria dei tipi di Microsoft Excel. Nella metà inferiore della finestra di dialogo si noterà che un file di implementazione denominato Excel8.cpp contiene wrapper di classe generati derivati da ColeDispatchDriver() e il file di intestazione della dichiarazione appropriato è denominato Excel8.h. Per Excel 2002 ed Excel 2003, i file sono denominati Excel.cpp e Excel.h.

    Nota Scegliere la libreria dei tipi corretta per la versione di Word che si sta automatizzando. Per informazioni su come trovare correttamente la libreria dei tipi, vedere la sezione riferimenti riportata di seguito.

  10. Fare clic su OK per chiudere la finestra di dialogo Creazione guidata classe MFC.

  11. Aggiungere il codice seguente alla funzione CAutoProjectApp::InitInstance(), che carica e abilita la libreria dei servizi COM:

    BOOL CAutoProjectApp::InitInstance()
      {
         if(!AfxOleInit())  // Your addition starts here
         {
            AfxMessageBox("Could not initialize COM dll");
            return FALSE;
         }                 // End of your addition
    
         AfxEnableControlContainer();
      .
      .
      .
    
      }
    
  12. Aggiungere la riga seguente alle istruzioni #include nella parte superiore del file di programma AutoProject.cpp:

      #include <afxdisp.h>
    
  13. Aggiungere l'istruzione include per il file di intestazione creato in precedenza (msword8.h, msword9.h o msword.h) in AutoProjectDlg.cpp dopo l'istruzione include per stdafx.h. Un esempio per Word 97 è:

       #include "stdafx.h"
       #include "msword8.h"
    
    
  14. Aggiungere codice di automazione al metodo CAutoProjectDlg::OnRun in modo che venga visualizzato come illustrato di seguito:

    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. Inserire il codice seguente nel codice specificato nel passaggio 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. Compilare ed eseguire il programma. Fare clic sul pulsante Esegui per avviare e visualizzare una lettera di esempio. Si noti che alcuni metodi sono stati modificati con Word 2000 e Word 2002. Per altre informazioni su queste modifiche, vedere la sezione "Riferimenti".

Riferimenti

Note per l'automazione di Microsoft Word 2000 e Microsoft Word 2002

Alcuni metodi e proprietà sono stati modificati per Microsoft Word 2000 e Microsoft Word 2002.

Per altre informazioni su Automazione di Office, visitare il sito di supporto per lo sviluppo di Microsoft Office all'indirizzo: supporto tecnico Microsoft