Visual C++ ve MFC kullanarak adres mektup birleştirme gerçekleştirmek için Microsoft Word'u otomatikleştirme

Özet

Bu makalede, Microsoft Visual C++ ve Microsoft Foundation Sınıflarından (MFC) Otomasyon kullanarak bir Microsoft Word belgesi oluşturma ve işleme işlemleri gösterilmektedir.

Daha Fazla Bilgi

Bu makale, Microsoft Visual Basic kullanarak aynı işlemi açıklayan bir Microsoft Bilgi Bankası makalesine paraleldir.

Otomasyon örneğini oluşturma

  1. Microsoft Developer Studio ile "AutoProject" adlı yeni bir "MFC AppWizard (exe)" projesi başlatın.

  2. MFC AppWizard'ın 1. adımında, uygulama türü için "İletişim Kutusu Tabanlı" öğesini seçin ve son'a tıklayın.

    Yeni Proje Bilgileri iletişim kutusu görüntülenir ve oluşturulacak Sınıfların şunları içerdiğini gösterir:

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

    Projeyi oluşturmak için Tamam'a tıklayın.

  3. "IDD_AUTOPROJECT_DIALOG" iletişim kutusu Visual Studio tasarım/düzenleme alanında açılır. Sonraki iki adımda verilen yönergelere göre değiştirin.

  4. Etiket denetimini (IDC_STATIC) ve İptal düğmesini (IDCANCEL) kaldırın.

  5. Tamam düğmesinin adını "IDRUN" ve resim yazısını "Çalıştır" olarak değiştirin. AutoProject.rc iletişim kutusu tasarım formunu kapatın.

  6. Görünüm menüsünde ClassWizard'a tıklayın (veya CTRL+W tuşlarına basın).

  7. İleti Eşlemeleri sekmesini seçin. Nesne Kimlikleri liste kutusunda IDRUN'ı seçin ve İletiler liste kutusunda "BN_CLICKED" öğesini seçin. İşlev Ekle'ye tıklayın ve "OnRun" işlev adını kabul edin. ClassWizard'ı kapatmak için Tamam'a tıklayın.

    NOT:** Bu adım, AutoProjectDLG.h adlı üst bilgi dosyasına "OnRun();" işlev üyesi için bir bildirim ekler. Bu adım ayrıca AutoProjectDLG.cpp adlı dosyaya CAutoProjectDlg::OnRun() adlı boş bir iskelet ileti işleyici işlevi ekler.

  8. Görünüm menüsünde ClassWizard'a tıklayın (veya CTRL+W tuşlarına basın).

  9. Otomasyon sekmesini seçin. Sınıf Ekle'ye tıklayın ve "Tür kitaplığından" öğesini seçin. Otomatikleştirmek istediğiniz uygulamanın nesne kitaplığını seçmek için gidin (bu örnekte, Excel 97'yi otomatikleştirirseniz Microsoft Excel 8.0 Nesne Kitaplığı'nı seçin; varsayılan konum C:\Program Files\Microsoft Office\Office\Excel8.olb'dir).

    Microsoft Excel 2000'i otomatikleştiriyorsanız, varsayılan konumuN C:\Program Files\Microsoft Office\Office\Excel9.olb olduğu Microsoft Excel 9.0 Nesne Kitaplığı'nı seçin.

    Microsoft Excel 2002 ve Microsoft Office Excel 2003'i otomatikleştiriyorsanız, nesne kitaplığı dosya Excel.exe eklenir. Office 2002'de Excel.exe için varsayılan konum C:\program Files\Microsoft Office\Office10\Excel.exe'dir. Office 2003'te Excel.exe için varsayılan konum C:\program Files\Microsoft Office\Office11\Excel.exe'dir. Uygun nesne kitaplığını seçtikten sonra Aç'a tıklayın. Sınıfları Onayla listesinden tüm sınıfları seçin ve ardından Tamam'a tıklayın.

    NOT Sınıfları Onayla iletişim kutusundaki liste kutusu, Microsoft Excel tür kitaplığındaki tüm IDispatch arabirimlerini (sınıflarla neredeyse aynı olan) içerir. İletişim kutusunun alt yarısında, Excel8.cpp adlı bir Uygulama dosyasının ColeDispatchDriver() öğesinden türetilmiş oluşturulmuş sınıf sarmalayıcıları içerdiğini ve uygun bildirim üst bilgisi dosyasının Excel8.h olarak adlandırıldığını görürsünüz. (Excel 2002 ve Excel 2003 için dosyalar Excel.cpp ve Excel.h olarak adlandırılır.)

    Not Otomatikleştirdiğiniz Word sürümü için doğru tür kitaplığını seçin. Doğru tür kitaplığını bulma hakkında bilgi için aşağıdaki başvurular bölümüne bakın.

  10. MFC ClassWizard iletişim kutusunu kapatmak için Tamam'a tıklayın.

  11. COM hizmetleri kitaplığını yükleyen ve etkinleştiren CAutoProjectApp::InitInstance() işlevine aşağıdaki kodu ekleyin:

    BOOL CAutoProjectApp::InitInstance()
      {
         if(!AfxOleInit())  // Your addition starts here
         {
            AfxMessageBox("Could not initialize COM dll");
            return FALSE;
         }                 // End of your addition
    
         AfxEnableControlContainer();
      .
      .
      .
    
      }
    
  12. AutoProject.cpp program dosyasının üst kısmındaki #include deyimlerine aşağıdaki satırı ekleyin:

      #include <afxdisp.h>
    
  13. Yukarıda oluşturulan üst bilgi dosyasının include deyimini (msword8.h, msword9.h veya msword.h) stdafx.h için include deyiminden sonra AutoProjectDlg.cpp dosyasına ekleyin. Word 97'ye örnek olarak aşağıdakiler gösterilebilir:

       #include "stdafx.h"
       #include "msword8.h"
    
    
  14. Aşağıda gösterildiği gibi görünmesi için CAutoProjectDlg::OnRun yöntemine Otomasyon kodu ekleyin:

    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. 3. adımda verilen koda yukarıdaki kodu ekleyin:

    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. Programınızı derleyin ve çalıştırın. Çalıştır düğmesine tıkladığınızda Microsoft Word bir örnek harf başlatıp görüntülemelidir. Word 2000 ve Word 2002 ile bazı yöntemlerin değiştiğini unutmayın. Bu değişiklikler hakkında daha fazla bilgi için "Başvurular" bölümüne bakın.

Başvurular

Microsoft Word 2000 ve Microsoft Word 2002'nin otomatikleştirilmesi için notlar

Microsoft Word 2000 ve Microsoft Word 2002 için bazı yöntemler ve özellikler değişmiştir.

Office Otomasyonu hakkında daha fazla bilgi için şu adreste Microsoft Office Geliştirme destek sitesini ziyaret edin: Microsoft Desteği