Jak automatizovat Excel z MFC a Visual C++ 2005 nebo Visual C++ .NET k vyplnění nebo získání dat v oblasti pomocí polí

Microsoft C# .NET verzi tohoto článku naleznete v tématu 302096. Microsoft Visual Basic .NET verzi tohoto článku naleznete v tématu 302094.

Poznámka

Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 a Microsoft Visual C++ .NET 2002 podporují model spravovaného kódu poskytovaný rozhraním Microsoft .NET Framework i nespravovaný nativní kódový model Microsoft Windows. Informace v tomto článku platí jenom pro nespravovaný kód Visual C++.

Souhrn

Tento podrobný článek ukazuje, jak automatizovat aplikaci Microsoft Excel z Visual C++ 2005 nebo Visual C++ .NET k vyplnění a načtení hodnot v oblasti s více buňkami pomocí polí.

Vytvoření klienta služby Automation pro Excel

Pokud chcete vyplnit oblast s více buňkami bez naplnění buněk po jednom, můžete nastavit vlastnost Value objektu Range na dvojrozměrné pole. Podobně můžete načíst dvojrozměrné pole hodnot pro více buněk najednou pomocí Value vlastnost. Následující kroky ukazují tento proces nastavení i načítání dat pomocí dvojrozměrných polí.

  1. Postupujte podle kroků v části Vytvoření klienta služby Automation v následujícím článku znalostní báze Microsoft Knowledge Base a vytvořte základního klienta služby Automation:

    307473 použití knihovny typů pro automatizaci Office z Visual C++ .NET

    V kroku 3 přidejte do formuláře druhé tlačítko a zaškrtávací políčko. Změňte ID tlačítka na IDC_GETVALUES a titulek na Získat hodnoty. Změňte ID zaškrtávacího políčka na IDC_CHECK a titulek na Vyplnit řetězci.

    V kroku 4 článku vyberte "Microsoft Excel 10.0 Object Library" Pokud automatizujete Excel 2002 z Office XP. Výchozí umístění aplikace Excel 2002 je C:\Program Files\Microsoft Office\Office10\Excel.exe. Nebo vyberte "Microsoft Excel 11.0 Object Library" (Knihovna objektů Microsoft Excelu 11.0), pokud automatizujete Microsoft Office Excel 2003. Výchozí umístění aplikace Excel 2003 je C:\Program Files\Microsoft Office\Office11\Excel.exe. Vyberte následující rozhraní aplikace Microsoft Excel:

    • _Aplikace
    • _Sešitu
    • _Listu
    • Rozsah
    • Sešity
    • Listy

    V kroku 6 přidejte následující příkazy #include přímo za direktivu #pragma once v souboru Autoprojectdlg.h:

    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    
    
  2. Přidejte následující dvě veřejné členské proměnné do třídy CAutoProjectDlg:

    CApplication oExcel;
    CWorkbook oBook;
    
    
  3. V dialogovém okně klikněte pravým tlačítkem na IDC_CHECK a vyberte Přidat proměnnou. Pojmenujte proměnnou m_bFillWithStrings a klikněte na Tlačítko Dokončit.

  4. V dialogovém okně poklikejte na Spustit a nahraďte následující kód.

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

    S:

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

    Poznámka V jazyce Visual C++ 2005 je nutné přidat možnost kompilátoru podpory modulu CLR (Common Language Runtime) (/clr:oldSyntax) pro úspěšnou kompilaci předchozí ukázky kódu. Pokud chcete přidat možnost kompilátoru podpory modulu CLR (Common Language Runtime), postupujte takto:

    1. Klikněte na Projekt a potom na Vlastnosti ProjectName.

      Poznámka:ProjectName je zástupný symbol pro název projektu.

    2. Rozbalte položku Vlastnosti konfigurace a potom klepněte na tlačítko Obecné.

    3. V pravém podokně kliknutím vyberte common language runtime support, old syntax (/clr:oldSyntax) v common language runtime podporu nastavení projektu.

    4. Klikněte na Použít a potom na OK.

    Další informace o možnostech kompilátoru podpory modulu CLR (Common Language Runtime) naleznete na následujícím webu Microsoft Developer Network (MSDN):

    https://msdn.microsoft.com/en-us/library/k8d11d4s.aspxTyto kroky platí pro celý článek.
    5. Vraťte se do dialogového okna a poklikejte na Získat hodnoty. Nahraďte následující kód.

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

    S:

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

Testování klienta služby Automation

  1. Stisknutím klávesy F5 sestavte a spusťte ukázkový program.
  2. Klikněte na Spustit. Aplikace spustí excel s novým sešitem a naplní buňky A1:E5 prvního listu číselnými daty z pole.
  3. Klikněte na Získat hodnoty. Program načte data v buňkách A1:E5 do nového pole a zobrazí výsledky v okně se zprávou.
  4. Vyberte Vyplnit řetězci a kliknutím na Spustit vyplňte buňky A1:E5 řetězcovými daty.
  5. Kliknutím na Získat hodnoty zobrazíte řetězcové hodnoty v okně se zprávou.

Řešení problémů

Pokud přidáte obálky tříd pro knihovnu objektů aplikace Excel pomocí možnosti Soubor v Průvodci přidáním třídy z knihovny TypeLib, může se při procházení do knihovny objektů zobrazit chybová zpráva. Chcete-li se tomuto problému vyhnout, zadejte úplnou cestu a název souboru pro knihovnu objektů místo procházení souboru.

Pokud se při vytváření ukázkové aplikace zobrazí následující chybová zpráva, změňte možnost Variant DialogBox v souboru CRange.h na Variant _DialogBox:

warning C4003: Not enough actual parameters for macro 'DialogBoxA'

Odkazy

Další informace naleznete na následujícím webu Microsoft Developer Network (MSDN): Microsoft Office Development with Visual Studio https://msdn.microsoft.com/en-us/library/aa188489(office.10).aspx

Další informace o použití polí k nastavení a načtení excelových dat v dřívějších verzích sady Visual Studio najdete v následujícím článku znalostní báze Knowledge Base:

247412 INFORMACE: Metody pro přenos dat do Excelu z jazyka Visual Basic