Dizileri kullanarak bir aralıktaki verileri doldurmak veya almak için MFC ve Visual C++ 2005 veya Visual C++ .NET'ten Excel'i otomatikleştirme

Bu makalenin Microsoft C# .NET sürümü için bkz. 302096. Bu makalenin Microsoft Visual Basic .NET sürümü için bkz. 302094.

Not

Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 ve Microsoft Visual C++ .NET 2002 hem Microsoft .NET Framework tarafından sağlanan yönetilen kod modelini hem de yönetilmeyen yerel Microsoft Windows kod modelini destekler. Bu makaledeki bilgiler yalnızca yönetilmeyen Visual C++ kodu için geçerlidir.

Özet

Bu adım adım makalede, dizileri kullanarak çok hücreli bir aralıktaki değerleri doldurmak ve almak için Visual C++ 2005 veya Visual C++ .NET'ten Microsoft Excel'i otomatikleştirme adımları gösterilmektedir.

Excel için Otomasyon İstemcisi Oluşturma

Çok hücreli bir aralığı hücreleri birer birer doldurmadan doldurmak için, Range nesnesinin Value özelliğini iki boyutlu bir dizi olarak ayarlayabilirsiniz. Benzer şekilde, Value özelliğini kullanarak aynı anda birden çok hücre için iki boyutlu bir değer dizisi alabilirsiniz. Aşağıdaki adımlar, iki boyutlu dizileri kullanarak verileri ayarlamaya ve almaya yönelik bu işlemi gösterir.

  1. Temel bir Otomasyon istemcisi oluşturmak için aşağıdaki Microsoft Bilgi Bankası makalesinin "Otomasyon İstemcisi Oluşturma" bölümündeki adımları izleyin:

    307473 Visual C++ .NET'ten Office Otomasyonu için Tür Kitaplığı Kullanma

    3. adımda, forma ikinci bir düğme ve onay kutusu ekleyin. Düğmenin kimliğini IDC_GETVALUES ve resim yazısını Değer Al olarak değiştirin. Onay kutusunun kimliğini IDC_CHECK ve resim yazısını Dizelerle Doldur olarak değiştirin.

    Office XP'den Excel 2002'yi otomatikleştiriyorsanız, makalenin 4. adımında "Microsoft Excel 10.0 Nesne Kitaplığı"nı seçin. Excel 2002 için varsayılan konum C:\Program Files\Microsoft Office\Office10\Excel.exe'dir. Microsoft Office Excel 2003'i otomatik hale getirmek için "Microsoft Excel 11.0 Nesne Kitaplığı" seçeneğini de belirleyebilirsiniz. Excel 2003 için varsayılan konum C:\Program Files\Microsoft Office\Office11\Excel.exe'dir. Aşağıdaki Microsoft Excel arabirimlerini seçin:

    • _Uygulama
    • _Çalışma kitabını
    • _Çalışma
    • Aralığı
    • Çalışma kitap -larını
    • Çalışma

    6. adımda aşağıdaki #include deyimlerini autoprojectdlg.h dosyasındaki #pragma kez yönergesinin hemen arkasına ekleyin:

    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    
    
  2. CAutoProjectDlg sınıfına aşağıdaki iki ortak üye değişkenini ekleyin:

    CApplication oExcel;
    CWorkbook oBook;
    
    
  3. İletişim kutunuzda IDC_CHECK sağ tıklayın ve Değişken Ekle'yi seçin. Değişkeni m_bFillWithStrings adlandırın ve Son'a tıklayın.

  4. İletişim kutunuzda Çalıştır'a çift tıklayın ve aşağıdaki kodu değiştirin

    void CAutoProjectDlg::OnBnClickedRun()
    {
    // TODO: Add your control notification handler code here
    }
    
    

    Ile:

    void CAutoProjectDlg::OnBnClickedRun()
    {
    CWorkbooks oBooks;
    CWorksheets oSheets;
    CWorksheet oSheet;
    CRange oRange;
    COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    // If you have not created Excel, create a new instance.
    if (oExcel.m_lpDispatch == NULL) {
    oExcel.CreateDispatch("Excel.Application");
    }
    // Show Excel to the user.
    oExcel.put_Visible(TRUE);
    oExcel.put_UserControl(TRUE);
    
    // Add a new workbook and get the first worksheet in that book.
    oBooks = oExcel.get_Workbooks();
    oBook = oBooks.Add(covOptional);
    oSheets = oBook.get_Worksheets();
    oSheet = oSheets.get_Item(COleVariant((short)1));
    
    // Get a range of data.
    oRange = oSheet.get_Range(COleVariant("A1"),covOptional);
    oRange = oRange.get_Resize(COleVariant((short)5),COleVariant((short)5));
    
    COleSafeArray saRet;
    DWORD numElements[2];
    numElements[0] = 5;
    numElements[1] = 5;
    
    long index[2];
    // Create a BSTR or double safe array.
    if (m_bFillWithStrings.GetCheck())
    saRet.Create(VT_BSTR,2,numElements);
    else
    saRet.Create(VT_R8,2,numElements);
    
    // Fill the array with data.
    for (int iRow = 1; iRow <= 5; iRow++) {
    for (int iCol = 1; iCol <= 5; iCol++) {
    index[0]=iRow-1;
    index[1]=iCol-1;
    if (m_bFillWithStrings.GetCheck()) {
    CString szTemp;
    szTemp.Format("%d|%d",iRow,iCol);
    BSTR bstr = szTemp.AllocSysString();
    saRet.PutElement(index,bstr);
    SysFreeString(bstr);
    } else {
    double d = iRow * iCol;
    saRet.PutElement(index,&d);
    }
    }
    }
    // Send the array to Excel.
    oRange.put_Value(covOptional,COleVariant(saRet));
    }
    
    

    Not Visual C++ 2005'te, önceki kod örneğini başarıyla derlemek için ortak dil çalışma zamanı desteği derleyici seçeneğini (/clr:oldSyntax) eklemeniz gerekir. Ortak dil çalışma zamanı desteği derleyici seçeneğini eklemek için şu adımları izleyin:

    1. Project'e ve ardından ProjectName Özellikleri'ne tıklayın.

      NotProjectName , projenin adı için bir yer tutucudur.

    2. Yapılandırma Özellikleri'ni genişletin ve genel'e tıklayın.

    3. Sağ bölmede, Ortak Dil Çalışma Zamanı destek projesi ayarlarında Ortak Dil Çalışma Zamanı Desteği, Eski Söz Dizimi (/clr:oldSyntax) öğesini seçmek için tıklayın.

    4. Uygula'yı ve ardından Tamam'ı tıklatın.

    Ortak dil çalışma zamanı desteği derleyici seçenekleri hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:

    https://msdn.microsoft.com/en-us/library/k8d11d4s.aspxBu adımlar makalenin tamamı için geçerlidir.
    5. İletişim kutunuza dönün ve Değerleri Al'a çift tıklayın. Aşağıdaki kodu değiştirin

    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    // TODO: Add your control notification handler code here
    }
    
    

    Ile:

    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    CWorksheets oSheets;
    CWorksheet oSheet;
    CRange oRange;
    COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    // Make sure that Excel has been started.
    if (oExcel.m_lpDispatch == NULL) {
    AfxMessageBox("Excel has not been started.  Press button1 to start Excel.");
    return;
    }
    // Get the first worksheet.
    oSheets = oBook.get_Worksheets();
    oSheet = oSheets.get_Item(COleVariant((short)1));
    // Set the range of data to retrieve
       oRange = oSheet.get_Range(COleVariant("A1"),COleVariant("E5"));
    
    // Get the data.
    COleSafeArray saRet(oRange.get_Value(covOptional));
    
    long iRows;
            long iCols;
            saRet.GetUBound(1, &iRows);
            saRet.GetUBound(2, &iCols);
    
    CString valueString = "Array Data:\r\n";
    long index[2];
    // Loop through the data and report the contents.
    for (int rowCounter = 1; rowCounter <= iRows; rowCounter++) {
    for (int colCounter = 1; colCounter <= iCols; colCounter++) {
    index[0]=rowCounter;
    index[1]=colCounter;   
    COleVariant vData;
    saRet.GetElement(index,vData);
    CString szdata(vData);
                valueString += szdata;
    valueString += "\t";
    }
    valueString += "\r\n";
    }
    AfxMessageBox(valueString,MB_SETFOREGROUND,NULL);
    }
    
    

Otomasyon İstemcisini Test Edin

  1. Örnek programı derlemek ve çalıştırmak için F5 tuşuna basın.
  2. Çalıştır'a tıklayın. Program Excel'i yeni bir çalışma kitabıyla başlatır ve ilk çalışma sayfasının A1:E5 hücrelerini bir dizideki sayısal verilerle doldurur.
  3. Değerleri Al'a tıklayın. Program, A1:E5 hücrelerindeki verileri yeni bir diziye alır ve sonuçları bir ileti kutusunda görüntüler.
  4. Dizelerle Doldur'u seçin ve A1:E5 hücrelerini dize verileriyle doldurmak için Çalıştır'a tıklayın.
  5. Dize değerlerini bir ileti kutusunda görüntülemek için Değer Al'a tıklayın.

Sorun giderme

TypeLib'den Sınıf Ekleme Sihirbazı'ndaki Dosya seçeneğini kullanarak Excel nesne kitaplığı için sınıf sarmalayıcıları eklerseniz, nesne kitaplığına göz atarken bir hata iletisi alabilirsiniz. Bu sorunu önlemek için, dosyaya göz atmak yerine nesne kitaplığının tam yolunu ve dosya adını yazın.

Örnek uygulamanızı oluştururken aşağıdaki hata iletisini alırsanız, CRange.h dosyasındaki "Variant DialogBox" öğesini "Variant _DialogBox" olarak değiştirin:

uyarı C4003: 'DialogBoxA' makros için yeterli gerçek parametre yok

Başvurular

Daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesine bakın: Visual Studio ile Microsoft Office Geliştirme https://msdn.microsoft.com/en-us/library/aa188489(office.10).aspx

Visual Studio'nun önceki sürümleriyle Excel verilerini ayarlamak ve almak için dizileri kullanma hakkında daha fazla bilgi için aşağıdaki Bilgi Bankası makalesine bakın:

247412 BİlGİ: Visual Basic'ten Excel'e Veri Aktarma Yöntemleri