如何使用 MFC 自动化 Excel 和填充具有数组范围

文章翻译 文章翻译
文章编号: 186120 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文演示了如何自动完成 Microsoft Excel 和值的数组,用填充一个多单元格区域。

更多信息

要填充一个多单元格区域,而不填充单元格一个接一个,您必须创建一个二维的变体 SAFEARRAY 通过 Range 对象的调用 SetValue 函数传递到 Excel 的。以下步骤说明了此过程。

自动完成 Microsoft Excel 2000 和 2002年的笔记

在这篇文章中的代码示例使用从 Excel 97 对象库 (Excel 8.olb) 生成的类包装。轻微的修改与此代码可用于为 Excel 2000 (Excel9.olb) 或 Excel 2002 (Excel.olb) 使用类包装的自动化客户端。有关使用 Microsoft Excel 2000 或 2002年类型库与本文所述将示例代码的其他信息,请单击下面文章编号,查看 Microsoft 知识库中相应:
224925为 Office 类型库可能随新发布更改信息:

创建项目的步骤

  1. 请按照步骤 1 到 12 英寸以下创建示例项目使用该 IDispatch 接口,并在 Excel8.olb 类型库中定义的成员函数在 Microsoft 知识库文章:
    178749如何创建自动化项目使用 MFC 和类型库
  2. 要创建在步骤 4 和步骤 5 中的父项目 178749 的对话框中,添加所指定的以下控件属性与。此外将添加相应的成员变量:
                                      Member                Member
          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
    					
  3. AutoProjectDlg.cpp 文件顶部添加以下行:
          #include "excel8.h"
    					
  4. 将下面的代码添加到 CAutoProjectDlg::OnRun() AutoProjectDlg.cpp 文件中。

    示例代码

          // 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);
    					
  5. 编译并运行该项目。
  6. 指定下列值对话框中,控件:
          Control               Contents
          ------------------------------
          IDC_STARTINGCELL      A1
          IDC_NUMROWS           10
          IDC_NUMCOLS           5
          IDC_STRING            True
    						
    单击确定。

    结果: 生成新的工作簿,并且第一个工作表的单元格 A1:E10 填入字符串值。
  7. 指定下列值对话框中,控件:
          Control               Contents
          ------------------------------
          IDC_STARTINGCELL      C3
          IDC_NUMROWS           2
          IDC_NUMCOLS           9
          IDC_STRING            False
    						
    单击确定。

    结果: 生成新的工作簿,并且第一个工作表的单元格 C3:K4 填入数字值。

参考

有关使用 MFC 的 Microsoft Excel 的自动化的详细信息请参阅 Microsoft 知识库中下面的文章:
186122如何使用 MFC 自动化 Excel 并从范围中获取一个数组

184663如何嵌入和自动化使用 MFC 的 Microsoft Excel 工作表

179706使用 MFC 自动化 Excel 和创建/格式新的工作簿

178781如何使用 MFC 和工作表函数的 Excel 的自动化

178783如何使用 MFC 创建 Excel 图表

属性

文章编号: 186120 - 最后修改: 2007年1月23日 - 修订: 4.2
这篇文章中的信息适用于:
  • Microsoft Excel 2000 标准版
  • Microsoft Visual C++ 5.0 企业版
  • Microsoft Visual C++ 6.0 企业版
  • Microsoft Visual C++ 5.0 专业版
  • Microsoft Visual C++ 6.0 专业版
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Excel 2002 标准版
  • Microsoft Excel 97 标准版
关键字:?
kbmt kbautomation kbcode kbhowto kbinterop KB186120 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 186120
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com