أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

كيفية أتمتة Excel من C++ بدون استخدام MFC أو #import

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية216686
الموجز
هناك العديد من المزايا كتابة التنفيذ الخاص بك التعليمات البرمجية في C++ مستقيم. أولاً ثم foremost ، يمكنك القيام تماماً ما تريده. بعد ذلك، سيتم التعليمات البرمجية الخاصة بك أصغر وأسرع أسهل التصحيح. ولن وأخيراً، التي تعتمد على أي مكتبات. حتى إذا كنت مخصص لاستخدام MFC الخاص الفئات المجمّع أو Visual C++ COM الأصلي تدعم (#import) ، قد لا تزال هناك بعمق guts IDispatch و التنفيذ COM للتعامل مع الأخطاء والقيود الشائعة مع هذه الإطارات.
معلومات أخرى
اتبع الخطوات أدناه إلى تطبيق وحدة التحكم بناء 6.0 C++ مرئية بسيطة بأتمتة Microsoft Office Excel باستخدام C++ فقط:
  1. بدء 6.0 Visual C++ ، ثم قم بإنشاء "تطبيق وحدة تحكم" جديد Win32 المسمى XlCpp. اختيار تطبيق "مرحباً, شبكة!" أساسي ثم انقر فوق إنهاء.
  2. افتح XlCpp.cpp الذي تم إنشاؤه ثم قم بإضافة التعليمة البرمجية التالية قبل الدالة main().
    #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. داخل دالة main() استبدال خط 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. ترجمة وتشغيله.
دالة AutoWrap() تبسط معظم التفاصيل ذات المستوى المنخفض المتضمنة مع استخدام IDispatch مباشرة. تتردد في استخدامه في التطبيقات الخاصة بك. واحد caveat أنه إذا قمت بتمرير معلمات متعددة تحتاج إلى تمرير في ترتيب عكسي. على سبيل المثال:
    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]);				
مراجع
لمزيد من المعلومات حول أتمتة Office باستخدام Visual C++ ، انقر فوق أرقام المقالات التالية لعرضها في "قاعدة المعارف لـ Microsoft:
196776أتمتة Office باستخدام Visual C++
216388B2CSE.exe تحويل التعليمات البرمجية Visual Basic التنفيذ إلى Visual C++
(c) 1999 شركة Microsoft ، كافة حقوق محجوز. المساهمات بواسطة جهاز أنس Crump ، Microsoft Corporation.

XL2007 _com_ptr_t CComPtr XL2003

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 216686 - آخر مراجعة: 05/11/2007 16:38:34 - المراجعة: 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 KbMtar
تعليقات
/html>&t=">nc=""> var varAutoFirePV = 1; var varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write(" >html>