Teď jste offline a čekáte, až se znova připojí internet.

Jak automatizovat Excel z C++ bez použití MFC nebo #import

Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.

Projděte si také anglickou verzi článku:216686
Souhrn
Má několik výhod psaní vaše automatizace kód rovný C++. A foremost můžete přesně co chcete provést. Váš kód dále bude menší, rychlejší a snadnější ladění. A nakonec nebude závislý na jakékoli knihoven. I když jsou vyhrazené pomocí MFC uživatele tříd obálky nebo Visual C++ COM nativní podporu (#import), může stále mít delve do guts IDispatch a automatizace COM k obejít běžné chyby a omezení s těchto platforem.
Další informace
Postupujte podle pokynů níže k sestavení jednoduchých Visual C++ 6.0 aplikace konzoly, který automatizuje aplikace Excel pomocí právě C++:
  1. Spustit Visual C++ 6.0 a vytvořit novou aplikaci konzoly Win32 s názvem XlCpp zvolit "Ahoj, World!" aplikace základní a klepněte na tlačítko Dokončit.
  2. Otevřete generované XlCpp.cpp a přidejte následující kód před main() funkce.
    #include <ole2.h> // OLE2 Definitions// AutoWrap() - Automation helper function...HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) {    // Begin variable-argument list...    va_list marker;    va_start(marker, cArgs);    if(!pDisp) {        MessageBox(NULL, "NULL IDispatch passed to AutoWrap()", "Error", 0x10010);        _exit(0);    }    // Variables used...    DISPPARAMS dp = { NULL, NULL, 0, 0 };    DISPID dispidNamed = DISPID_PROPERTYPUT;    DISPID dispID;    HRESULT hr;    char buf[200];    char szName[200];        // Convert down to ANSI    WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);        // Get DISPID for name passed...    hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);    if(FAILED(hr)) {        sprintf(buf, "IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx", szName, hr);        MessageBox(NULL, buf, "AutoWrap()", 0x10010);        _exit(0);        return hr;    }        // Allocate memory for arguments...    VARIANT *pArgs = new VARIANT[cArgs+1];    // Extract arguments...    for(int i=0; i<cArgs; i++) {        pArgs[i] = va_arg(marker, VARIANT);    }        // Build DISPPARAMS    dp.cArgs = cArgs;    dp.rgvarg = pArgs;        // Handle special-case for property-puts!    if(autoType & DISPATCH_PROPERTYPUT) {        dp.cNamedArgs = 1;        dp.rgdispidNamedArgs = &dispidNamed;    }        // Make the call!    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);    if(FAILED(hr)) {        sprintf(buf, "IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx", szName, dispID, hr);        MessageBox(NULL, buf, "AutoWrap()", 0x10010);        _exit(0);        return hr;    }    // End variable-argument section...    va_end(marker);        delete [] pArgs;        return hr;}						
  3. Uvnitř funkce main() nahraďte následující kód řádku printf().
       // Initialize COM for this thread...   CoInitialize(NULL);   // Get CLSID for our server...   CLSID clsid;   HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);   if(FAILED(hr)) {      ::MessageBox(NULL, "CLSIDFromProgID() failed", "Error", 0x10010);      return -1;   }   // Start server and get IDispatch...   IDispatch *pXlApp;   hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);   if(FAILED(hr)) {      ::MessageBox(NULL, "Excel not registered properly", "Error", 0x10010);      return -2;   }   // Make it visible (i.e. app.visible = 1)   {      VARIANT x;      x.vt = VT_I4;      x.lVal = 1;      AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x);   }   // Get Workbooks collection   IDispatch *pXlBooks;   {      VARIANT result;      VariantInit(&result);      AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);      pXlBooks = result.pdispVal;   }   // Call Workbooks.Add() to get a new workbook...   IDispatch *pXlBook;   {      VARIANT result;      VariantInit(&result);      AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Add", 0);      pXlBook = result.pdispVal;   }   // Create a 15x15 safearray of variants...   VARIANT arr;   arr.vt = VT_ARRAY | VT_VARIANT;   {      SAFEARRAYBOUND sab[2];      sab[0].lLbound = 1; sab[0].cElements = 15;      sab[1].lLbound = 1; sab[1].cElements = 15;      arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);   }   // Fill safearray with some values...   for(int i=1; i<=15; i++) {      for(int j=1; j<=15; j++) {         // Create entry value for (i,j)         VARIANT tmp;         tmp.vt = VT_I4;         tmp.lVal = i*j;         // Add to safearray...         long indices[] = {i,j};         SafeArrayPutElement(arr.parray, indices, (void *)&tmp);      }   }   // Get ActiveSheet object   IDispatch *pXlSheet;   {      VARIANT result;      VariantInit(&result);      AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);      pXlSheet = result.pdispVal;   }   // Get Range object for the Range A1:O15...   IDispatch *pXlRange;   {      VARIANT parm;      parm.vt = VT_BSTR;      parm.bstrVal = ::SysAllocString(L"A1:O15");      VARIANT result;      VariantInit(&result);      AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);      VariantClear(&parm);      pXlRange = result.pdispVal;   }   // Set range with our safearray...   AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);   // Wait for user...   ::MessageBox(NULL, "All done.", "Notice", 0x10000);   // Set .Saved property of workbook to TRUE so we aren't prompted   // to save when we tell Excel to quit...   {      VARIANT x;      x.vt = VT_I4;      x.lVal = 1;      AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlBook, L"Saved", 1, x);   }   // Tell Excel to quit (i.e. App.Quit)   AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0);   // Release references...   pXlRange->Release();   pXlSheet->Release();   pXlBook->Release();   pXlBooks->Release();   pXlApp->Release();   VariantClear(&arr);   // Uninitialize COM for this thread...   CoUninitialize();						
  4. Zkompilujte a spustit.
Funkce AutoWrap() zjednodušuje většinu zapojených IDispatch přímo pomocí nižší úrovně podrobností. Cítit volného použít v implementacích vlastní. Jeden caveat je Pokud předat více parametrů, které potřebují být předány zpětné objednávky. Například:
    VARIANT parm[3];    parm[0].vt = VT_I4; parm[0].lVal = 1;    parm[1].vt = VT_I4; parm[1].lVal = 2;    parm[2].vt = VT_I4; parm[2].lVal = 3;    AutoWrap(DISPATCH_METHOD, NULL, pDisp, L"call", 3, parm[2], parm[1], parm[0]);				
Odkazy
Další informace o automatizaci Office pomocí Visual C++ klepněte na následující čísla následujících článcích databáze Microsoft Knowledge Base:
196776Automatizace Office pomocí Visual C++
216388B2CSE.exe převede kód automatizace jazyka Visual C++
(c) 1999 Microsoft Corporation, všechny rezervované práv. Příspěvky Jana Crump, Microsoft Corporation.

_com_ptr_t CComPtr XL2003 XL2007

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 216686 - Poslední kontrola: 05/11/2007 16:38:34 - Revize: 5.2

Microsoft Office Excel 2007, Microsoft Office Excel 2003, Microsoft Excel 2002 Standard Edition, Microsoft Excel 2000 Standard Edition, Microsoft Excel 97 Standard Edition, Microsoft Visual C++ 5.0 Enterprise Edition, Microsoft Visual C++ 6.0 Enterprise Edition, Microsoft Visual C++ 5.0 Professional Edition, Microsoft Visual C++ 6.0 Professional Edition, Microsoft Visual C++, 32-bit Learning Edition 6.0

  • kbmt kbautomation kbhowto KB216686 KbMtcs
Váš názor
/html>ript> peat="language in languagesListForLargeScreens track by $index" class="col-sm-6 col-xs-24 ng-scope"> Uruguay - Español
대한민국 - 한국어
España - Español
Paraguay - Español
Venezuela - Español
did=1&t=">0&did=1&t="> >>&t="> "//c.microsoft.com/ms.js'><\/script>"); >