كيفية أتمتة Excel من MFC و Visual c + + 2005 أو Visual c + +.NET لتعبئة أو الحصول على البيانات في نطاق باستخدام الصفائف

للحصول على إصدار Microsoft C#.NET من هذه المقالة، راجع
302096 .
للحصول على إصدار Microsoft Visual Basic.NET من هذه المقالة، راجع
302094 .
ملاحظة: تدعم Microsoft Visual c + + 2005 و Microsoft Visual c + +.NET 2003 و Microsoft Visual c + +.NET 2002 كل من طراز التعليمات البرمجية المدارة التي يتم توفيرها من قبل Microsoft.NET Framework وغير المدارة نموذج التعليمات البرمجية الأصلية في Microsoft Windows. تنطبق المعلومات الواردة في هذه المقالة فقط على التعليمات البرمجية غير المدارة Visual c + +.

ملخص

توضح هذه المقالة خطوة بخطوة كيفية أتمتة Microsoft Excel من Visual c + + 2005 أو Visual c + +.NET لتعبئة واسترداد قيم في نطاق خلايا باستخدام صفائف.

إنشاء عميل التنفيذ تلقائي ل Excel

لتعبئة نطاق خلايا دون ملء الخلايا واحد في كل مرة، يمكنك تعيين الخاصية قيمة كائن النطاق إلى صفيف ثنائي الأبعاد. وبالمثل، يمكنك استرداد صفيف ثنائي الأبعاد من قيم خلايا متعددة في وقت واحد باستخدام خاصية القيمة . توضح الخطوات التالية في هذه العملية لكل من تعيين واسترداد البيانات باستخدام صفائف ثنائية الأبعاد.
  1. اتبع الخطوات الموجودة في قسم "إنشاء عميل التنفيذ التلقائي" من مقالة قاعدة معارف Microsoft التالية لإنشاء عميل التنفيذ تلقائي أساسية:
    كيفية استخدام مكتبة نوع للتشغيل الآلي للمكاتب من Visual c + +.NET 307473
    في الخطوة 3، إضافة خانة الاختيار وزر ثاني إلى النموذج. تغيير معرف الزر إلى IDC_GETVALUES والتسمية التوضيحية الحصول على قيم. تغيير معرف خانة الاختيار إلى IDC_CHECK والتسمية التوضيحية تعبئة بالسلاسل.

    في الخطوة 4 من هذه المادة، حدد "Microsoft Excel 10.0 كائن مكتبة" إذا يتم أتمتة Excel 2002 من Office XP. الموقع الافتراضي ل Excel 2002 هو C:\Program Office\Office10\Excel.exe مايكروسوفت. أو، حدد "مكتبة كائنات 11.0 Excel Microsoft" إذا يتم أتمتة Microsoft Office Excel 2003. الموقع الافتراضي ل Excel 2003 هو C:\Program Office\Office11\Excel.exe مايكروسوفت. تحديد الواجهات Microsoft Excel التالية:
    • _Application
    • _Workbook
    • _Worksheet
    • النطاق
    • المصنفات
    • أوراق العمل
    يضاف ما يلي في الخطوة 6، #include عبارات مباشرة بعد التوجيه #pragma مرة واحدة في Autoprojectdlg.h:
    #include "CApplication.h"#include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"

  2. إضافة متغيرات عضو عام اثنين التالية إلى الفئة كوتوبروجيكتدلج :
    CApplication oExcel;CWorkbook oBook;

  3. في مربع الحوار، انقر بالزر الأيمن IDC_CHECK وحدد إضافة متغير. اسم m_bFillWithStrings المتغير، ثم انقر فوق إنهاء.
  4. في مربع الحوار، انقر نقراً مزدوجاً فوق تشغيل واستبدال التعليمات البرمجية التالية
    void CAutoProjectDlg::OnBnClickedRun(){
    // TODO: Add your control notification handler code here
    }

    بواسطة:
    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));
    }

    ملاحظة: في Visual c + + 2005, يجب عليك إضافة اللغة وقت التشغيل دعم برنامج التحويل البرمجي خيار (/clr:oldSyntax) ترجمة نموذج التعليمات البرمجية السابق بنجاح. لإضافة خيار المحول البرمجي دعم وقت تشغيل اللغة العامة، اتبع الخطوات التالية:

    1. انقر فوق المشروعومن ثم انقر فوق

      خصائص اسم المشروع .



      ملاحظة: اسم المشروع عنصرا نائبا لاسم المشروع.
    2. توسيع خصائص تكوينومن ثم انقر فوق

      عام.

    3. في الجزء الأيسر، انقر فوق لتحديد دعم وقت تشغيل اللغة العامة, بناء الجملة القديمة (/clr: oldsyntax) في

      إعدادات المشروع دعم "وقت تشغيل اللغة العامة" .
    4. انقر فوق

      تطبيق، ثم انقر فوق موافق.

    لمزيد من المعلومات حول خيارات برنامج التحويل البرمجي دعم وقت تشغيل اللغة العامة، قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:

    تطبيق هذه الخطوات لكل مادة.
  5. الرجوع إلى مربع الحوار الخاص بك وانقر نقراً مزدوجاً فوق الحصول على القيم. استبدال التعليمات البرمجية التالية
    void CAutoProjectDlg::OnBnClickedGetvalues(){
    // TODO: Add your control notification handler code here
    }

    بواسطة:
    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);
    }

اختبار عميل التنفيذ التلقائي

  1. اضغط F5 لإنشاء وتشغيل نموذج البرنامج.
  2. انقر فوق تشغيل. تبدأ تشغيل Excel مع مصنف جديد البرنامج ويقوم بملء A1:E5 الخلايا من ورقة العمل الأولى مع البيانات الرقمية من صفيف.
  3. انقر فوق الحصول على قيم. البرنامج يقوم باسترداد البيانات في الخلايا A1:E5 إلى صفيف جديد وعرض النتائج في مربع رسالة.
  4. حدد تعبئة باستخدام سلاسل ثم انقر فوق تشغيل لتعبئة الخلايا A1:E5 ببيانات سلسلة.
  5. انقر فوق الحصول على قيم لعرض قيم السلسلة في مربع رسالة.

استكشاف الأخطاء وإصلاحها

إذا قمت بإضافة wrappers فئة مكتبة كائن Excel باستخدام الخيار ملف في معالج إضافة فئة من TypeLib، قد تتلقى رسالة خطأ عند استعراض مكتبة الكائن. لتجنب هذه المشكلة، اكتب اسم ومسار الملف الكامل لمكتبة الكائن بدلاً من استعراض للملف.
للحصول على معلومات إضافية، انقر فوق رقم المقال التالي لعرضه في "قاعدة معارف Microsoft":
خطأ 311408 : 'للقراءة فقط' تحذير عند إضافة فئة MFC من مكتبة
إذا تلقيت رسالة الخطأ التالية عند إنشاء نموذج التطبيق الخاص بك، تغيير "متغير ديالوجبوكس" في CRange.h إلى "البديل _DialogBox":
تحذير C4003: معلمات غير كافية الفعلي لماكرو 'ديالوجبوكسا'
لمزيد من المعلومات حول السبب هذا الخطأ، راجع مقالة قاعدة المعارف التالية:
الخطأ 311407 : معالج MFC لا حل تعارضات مع وحدات الماكرو API التسمية

المراجع

لمزيد من المعلومات، راجع موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:
تطوير Microsoft Office باستخدام Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
لمزيد من المعلومات حول استخدام صفائف لتعيين واسترداد بيانات Excel مع الإصدارات السابقة من Visual Studio، راجع مقالة قاعدة المعارف التالية:
كيفية استخدام MFC لأتمتة Excel وتعبئة نطاق صفيف 186120
كيفية استخدام MFC لأتمتة Excel والحصول على صفيف من نطاق 186122
معلومات 247412 : الأساليب لنقل البيانات إلى Excel من Visual Basic
خصائص

رقم الموضوع: 308407 - آخر مراجعة: 18‏/01‏/2017 - المراجعة: 1

تعليقات