要使用 MFC 使 Excel 和使用数组填充区域

 

第一步: 创建一个对话框程序:

请按步骤 1 到 12 Microsoft 知识库文章以创建示例项目, 使用 IDispatch 接口和成员函数 Excel8.olb 类型库中定义了以下文章中:

178749 (http://support.microsoft.com/kb/178749/EN-US/) 如何创建自动化项目使用 MFC 和类型库
 

第二步: 增加几个控件:

在步骤 4 和 5 的父项目创建到对话框 178749 (http://support.microsoft.com/kb/178749/EN-US/) 添加下列控件与属性所指定。 还添加相应成员变量:

     Control   Name              Variable Type         Variable Name
      -----------------------------------------------------------------
      Edit      IDC_STARTINGCELL  m_sStartingCell       CString
      Edit      IDC_NUMROWS       m_iNumRows            short
      Edit      IDC_NUMCOLS       m_iNumCols            short
      CheckBox  IDC_STRING        m_bFillWithStrings    BOOL
    

 

第三步:  增加头文件

在添加到 AutoProjectDlg.cpp 文件, 顶部添加以下行:     #include "excel8.h"   

 

第四步:  添加如下代码 : 

 // OLE Variant for Optional.
      COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

      _Application objApp;

      _Workbook objBook;
      Workbooks objBooks;
      Worksheets objSheets;
      _Worksheet objSheet;
      Range range;

      if(!UpdateData(TRUE))
      {
         return;
      }

      // Instantiate Excel and start a new workbook.
      objApp.CreateDispatch("Excel.Application");
      objBooks = objApp.GetWorkbooks();
      objBook = objBooks.Add(VOptional);
      objSheets = objBook.GetWorksheets();
      objSheet = objSheets.GetItem(COleVariant((short)1));

      //Get the range where the starting cell has the address
      //m_sStartingCell and it's dimensions are m_iNumRows x m_iNumCols.
      range = objSheet.GetRange(COleVariant(m_sStartingCell),
                                COleVariant(m_sStartingCell));
      range = range.GetResize(COleVariant(m_iNumRows),
                              COleVariant(m_iNumCols));

      //*** Fill the range with an array of values.

      //Create the SAFEARRAY.
      COleSafeArray saRet;
      DWORD numElements[2];
      numElements[0]= m_iNumRows;   //Number of rows in the range.
      numElements[1]= m_iNumCols;   //Number of columns in the range.

      if(m_bFillWithStrings)
      {
         saRet.Create(VT_BSTR, 2, numElements);
      }
      else
      {
         saRet.Create(VT_R8, 2, numElements);
      }

      //Fill the SAFEARRAY.
      long index[2];
      long iRow;
      long iCol;

      for(iRow=0;iRow<=m_iNumRows-1;iRow++)
      {
         for(iCol=0;iCol<=m_iNumCols-1;iCol++)
         {
            index[0] = iRow;
            index[1] = iCol;
            if(m_bFillWithStrings)      //Fill with Strings.
            {
               VARIANT v;
               CString s;
               VariantInit(&v);
               v.vt = VT_BSTR;
               s.Format("r%dc%d", iRow, iCol);
               v.bstrVal = s.AllocSysString();
               saRet.PutElement(index, v.bstrVal);
               SysFreeString(v.bstrVal);
               VariantClear(&v);
            }
            else                     //Fill with Numbers.
            {
               double d;
               d = (iRow*1000) + iCol;
               saRet.PutElement(index, &d);
            }
         }
      }

      //Set the range value to the SAFEARRAY.
      range.SetValue(COleVariant(saRet));
      saRet.Detach();

      //Return control of Excel to the user.
      objApp.SetVisible(TRUE);
      objApp.SetUserControl(TRUE);
 

  第五步: 编译并运行该项目
 

 第六步: 设置参数1,查看结果

为控件对话框上指定下列值:

 Control               Contents
      ------------------------------
      IDC_STARTINGCELL      A1
      IDC_NUMROWS           10
      IDC_NUMCOLS           5
      IDC_STRING            True

单击确定。

结果: 生成一个新工作簿而且的第一工作表单元格 A1:E10 已填充了字符串值。

 
 第七步: 设置参数2,查看结果 
   为控件对话框上指定下列值: 
      Control               Contents
      ------------------------------
      IDC_STARTINGCELL      C3
      IDC_NUMROWS           2
      IDC_NUMCOLS           9
      IDC_STRING            False
						
单击确定。

结果: 生成一个新工作簿而且的第一工作表单元格 C3:K4 已填充了数值。

 

你可能感兴趣的:(工作,String,Microsoft,Excel,application,mfc)