Udostępnij za pośrednictwem


Jak zautomatyzować program Excel z MFC i Visual C++ 2005 lub Visual C++ .NET w celu wypełnienia lub uzyskania danych w zakresie przy użyciu tablic

Aby zapoznać się z wersją tego artykułu na platformie .NET w języku Microsoft C#, zobacz 302096. Aby zapoznać się z wersją programu Microsoft Visual Basic dla platformy .NET w tym artykule, zobacz 302094.

Uwaga

Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 i Microsoft Visual C++ .NET 2002 obsługują zarówno model kodu zarządzanego udostępniany przez .NET Framework firmy Microsoft, jak i niezarządzany natywny model kodu systemu Microsoft Windows. Informacje zawarte w tym artykule dotyczą tylko niezarządzanego kodu visual C++.

Podsumowanie

W tym artykule krok po kroku pokazano, jak zautomatyzować program Microsoft Excel z programu Visual C++ 2005 lub Visual C++ .NET w celu wypełniania i pobierania wartości w zakresie wielu komórek przy użyciu tablic.

Tworzenie klienta usługi Automation dla programu Excel

Aby wypełnić zakres wielu komórek bez wypełniania komórek pojedynczo, można ustawić właściwość Value obiektu Range na tablicę dwuwymiarową. Podobnie można pobrać dwuwymiarową tablicę wartości dla wielu komórek jednocześnie przy użyciu właściwości Value. W poniższych krokach przedstawiono ten proces ustawiania i pobierania danych przy użyciu tablic dwuwymiarowych.

  1. Wykonaj kroki opisane w sekcji "Tworzenie klienta usługi Automation" w następującym artykule bazy wiedzy Microsoft Knowledge Base, aby utworzyć podstawowego klienta usługi Automation:

    307473 jak używać biblioteki typów dla usługi Office Automation z programu Visual C++ .NET

    W kroku 3 dodaj drugi przycisk i pole wyboru do formularza. Zmień identyfikator przycisku na IDC_GETVALUES, a podpis na Pobierz wartości. Zmień identyfikator pola wyboru na IDC_CHECK, a podpis na Wypełnij ciągami.

    W kroku 4 artykułu wybierz pozycję "Biblioteka obiektów programu Microsoft Excel 10.0", jeśli automatyzujesz program Excel 2002 z pakietu Office XP. Domyślną lokalizacją programu Excel 2002 jest C:\Program Files\Microsoft Office\Office10\Excel.exe. Możesz też wybrać pozycję "Biblioteka obiektów programu Microsoft Excel 11.0", jeśli automatyzujesz program Microsoft Office Excel 2003. Domyślną lokalizacją programu Excel 2003 jest C:\Program Files\Microsoft Office\Office11\Excel.exe. Wybierz następujące interfejsy programu Microsoft Excel:

    • _Aplikacji
    • _Skoroszyt
    • _Arkusza
    • Zakres
    • Skoroszytów
    • Arkuszy

    W kroku 6 dodaj następujące instrukcje #include bezpośrednio po dyrektywie #pragma once w pliku Autoprojectdlg.h:

    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    
    
  2. Dodaj następujące dwie publiczne zmienne członkowskie do klasy CAutoProjectDlg:

    CApplication oExcel;
    CWorkbook oBook;
    
    
  3. W oknie dialogowym kliknij prawym przyciskiem myszy IDC_CHECK i wybierz pozycję Dodaj zmienną. Nadaj zmiennej nazwę m_bFillWithStrings i kliknij przycisk Zakończ.

  4. W oknie dialogowym kliknij dwukrotnie pozycję Uruchom i zastąp następujący kod

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

    Z:

    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));
    }
    
    

    Uwaga W programie Visual C++ 2005 należy dodać opcję kompilatora obsługi środowiska uruchomieniowego języka wspólnego (/clr:oldSyntax), aby pomyślnie skompilować poprzedni przykład kodu. Aby dodać opcję kompilatora obsługi środowiska uruchomieniowego języka wspólnego, wykonaj następujące kroki:

    1. Kliknij pozycję Project (Projekt), a następnie kliknij pozycję ProjectName Properties (Właściwości projectname).

      UwagaProjectName jest symbolem zastępczym nazwy projektu.

    2. Rozwiń węzeł Właściwości konfiguracji, a następnie kliknij pozycję Ogólne.

    3. W okienku po prawej stronie kliknij, aby wybrać pozycję Obsługa środowiska uruchomieniowego języka wspólnego, Stara składnia (/clr:oldSyntax) w ustawieniach projektu obsługi środowiska uruchomieniowego języka wspólnego .

    4. Kliknij przycisk Zastosuj, a następnie przycisk OK.

    Aby uzyskać więcej informacji na temat opcji kompilatora obsługi środowiska uruchomieniowego języka wspólnego, odwiedź następującą witrynę sieci Web Microsoft Developer Network (MSDN):

    https://msdn.microsoft.com/en-us/library/k8d11d4s.aspxTe kroki dotyczą całego artykułu.
    5. Wróć do okna dialogowego i kliknij dwukrotnie pozycję Pobierz wartości. Zastąp następujący kod

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

    Z:

    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);
    }
    
    

Testowanie klienta usługi Automation

  1. Naciśnij klawisz F5, aby skompilować i uruchomić przykładowy program.
  2. Kliknij przycisk Uruchom. Program uruchamia program Excel z nowym skoroszytem i wypełnia komórki A1:E5 pierwszego arkusza danymi liczbowymi z tablicy.
  3. Kliknij pozycję Pobierz wartości. Program pobiera dane w komórkach A1:E5 do nowej tablicy i wyświetla wyniki w polu komunikatu.
  4. Wybierz pozycję Wypełnij ciągami i kliknij przycisk Uruchom, aby wypełnić komórki A1:E5 danymi ciągu.
  5. Kliknij pozycję Pobierz wartości, aby wyświetlić wartości ciągu w polu komunikatu.

Rozwiązywanie problemów

Jeśli dodasz otoki klas dla biblioteki obiektów programu Excel przy użyciu opcji Plik w Kreatorze dodawania klasy z biblioteki TypeLib, podczas przechodzenia do biblioteki obiektów może zostać wyświetlony komunikat o błędzie. Aby uniknąć tego problemu, wpisz pełną ścieżkę i nazwę pliku biblioteki obiektów zamiast przechodzenia do pliku.

Jeśli podczas tworzenia przykładowej aplikacji zostanie wyświetlony następujący komunikat o błędzie, zmień opcję "Variant DialogBox" w pliku CRange.h na "Variant _DialogBox":

ostrzeżenie C4003: za mało rzeczywistych parametrów dla makra "DialogBoxA"

Informacje

Aby uzyskać więcej informacji, zobacz następującą witrynę sieci Web microsoft developer network (MSDN): Microsoft Office Development with Visual Studio (Microsoft Office Development with Visual Studio) (Programowanie w pakiecie Microsoft Office za pomocą programu Visual Studio) https://msdn.microsoft.com/en-us/library/aa188489(office.10).aspx

Aby uzyskać więcej informacji na temat używania tablic do ustawiania i pobierania danych programu Excel z wcześniejszymi wersjami programu Visual Studio, zobacz następujący artykuł z bazy wiedzy Knowledge Base:

247412 INFO: Metody przesyłania danych do programu Excel z programu Visual Basic