Del via


Slik automatiserer du Microsoft Word til å utføre en utskriftsfletting ved hjelp av Visual C++ og MFC

Sammendrag

Denne artikkelen viser hvordan du oppretter og manipulerer et Microsoft Word-dokument ved hjelp av automatisering fra Microsoft Visual C++ og Microsoft Foundation Classes (MFC).

Mer informasjon

Denne artikkelen paralleller en Microsoft Knowledge Base-artikkel som beskriver den samme prosessen ved hjelp av Microsoft Visual Basic.

Bygge automatiseringseksempelet

  1. Med Microsoft Developer Studio starter du et nytt «MFC AppWizard (exe)»-prosjekt med navnet «AutoProject».

  2. I trinn 1 i MFC AppWizard velger du Dialogbasert for programtypen, og deretter klikker du Fullfør.

    Dialogboksen Ny prosjektinformasjon vises og angir at klassene som skal opprettes, omfatter:

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

    Klikk OK for å opprette prosjektet.

  3. Dialogboksen «IDD_AUTOPROJECT_DIALOG» åpnes i utformings-/redigeringsområdet i Visual Studio. Endre den i henhold til instruksjonene i de neste to trinnene.

  4. Fjern etikettkontrollen (IDC_STATIC) og Avbryt-knappen (IDCANCEL).

  5. Endre navnet på OK-knappen til «IDRUN» og bildeteksten til «Kjør». Lukk utformingsskjemaet for dialogboksen AutoProject.rc.

  6. Klikk Klasseveiviser på Vis-menyen (eller trykk CTRL+W).

  7. Velg Meldingskart-fanen. Velg IDRUN i listen over objekt-ID-er, og velg «BN_CLICKED» i meldingslisteboksen. Klikk Legg til funksjon, og godta funksjonsnavnet OnRun. Klikk OK for å lukke klasseveiviseren.

    OBS:** Dette trinnet legger til en deklarasjon for funksjonsmedlemmet «OnRun();» i topptekstfilen AutoProjectDLG.h. Dette trinnet legger også til en tom skjelettmeldingsbehandlingsfunksjon kalt CAutoProjectDlg::OnRun() i filen AutoProjectDLG.cpp.

  8. Klikk Klasseveiviser på Vis-menyen (eller trykk CTRL+W).

  9. Velg automatiseringsfanen. Klikk Legg til klasse, og velg Fra et typebibliotek. Naviger for å velge objektbiblioteket for programmet du vil automatisere (hvis du for eksempel automatiserer Excel 97, velger du Objektbibliotek for Microsoft Excel 8.0. Standardplasseringen er C:\Programfiler\Microsoft Office\Office\Excel8.olb).

    Hvis du automatiserer Microsoft Excel 2000, velger du Microsoft Excel 9.0-objektbibliotek der standardplasseringen er C:\Programfiler\Microsoft Office\Office\Excel9.olb.

    Hvis du automatiserer Microsoft Excel 2002 og Microsoft Office Excel 2003, er objektbiblioteket innebygd i filen Excel.exe. Standardplasseringen for Excel.exe i Office 2002 er C:\program Files\Microsoft Office\Office10\Excel.exe. Standardplasseringen for Excel.exe i Office 2003 er C:\program Files\Microsoft Office\Office11\Excel.exe. Når du har valgt det aktuelle objektbiblioteket, klikker du Åpne. Velg alle klassene i listen Bekreft klasser, og klikk deretter OK.

    MERK Listeboksen i dialogboksen Bekreft klasser inneholder alle IDispatch-grensesnittene (som er nesten identiske med klasser) i typebiblioteket i Microsoft Excel. I den nedre halvdelen av dialogboksen ser du at en implementeringsfil kalt Excel8.cpp inneholder genererte klassepakkere avledet fra ColeDispatchDriver(), og riktig deklarasjonshodefil heter Excel8.h. (For Excel 2002 og Excel 2003 heter filene Excel.cpp og Excel.h.)

    Merk Velg riktig typebibliotek for versjonen av Word du automatiserer. Se referansedelen nedenfor for informasjon om hvordan du finner riktig type bibliotek.

  10. Klikk OK for å lukke dialogboksen MFC ClassWizard.

  11. Legg til følgende kode i CAutoProjectApp::InitInstance()-funksjonen, som laster inn og aktiverer COM-tjenestebiblioteket:

    BOOL CAutoProjectApp::InitInstance()
      {
         if(!AfxOleInit())  // Your addition starts here
         {
            AfxMessageBox("Could not initialize COM dll");
            return FALSE;
         }                 // End of your addition
    
         AfxEnableControlContainer();
      .
      .
      .
    
      }
    
  12. Legg til følgende linje i #include-setninger øverst i AutoProject.cpp-programfilen:

      #include <afxdisp.h>
    
  13. Legg til inkluderingssetningen for topptekstfilen som ble opprettet ovenfor (enten msword8.h, msword9.h eller msword.h) i AutoProjectDlg.cpp etter inkluderingssetningen for stdafx.h. Et eksempel for Word 97 vil være:

       #include "stdafx.h"
       #include "msword8.h"
    
    
  14. Legg til automatiseringskode i CAutoProjectDlg::OnRun-metoden slik at den vises som vist nedenfor:

    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. Sett inn følgende kode ovenfor i koden som er gitt i trinn 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. Kompiler og kjør programmet. Klikk Kjør-knappen , så skal Microsoft Word starte og vise en eksempelbokstav. Vær oppmerksom på at noen metoder er endret med Word 2000 og Word 2002. Hvis du vil ha mer informasjon om disse endringene, kan du se delen Referanser.

Referanser

Notater for å automatisere Microsoft Word 2000 og Microsoft Word 2002

Noen metoder og egenskaper er endret for Microsoft Word 2000 og Microsoft Word 2002.

Hvis du vil ha mer informasjon om Office-automatisering, kan du gå til kundestøtteområdet for Microsoft Office Development på: Microsoft Kundestøtte