你目前正处于脱机状态,正在等待 Internet 重新连接

如何使用 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 图表

警告:本文已自动翻译

属性

文章 ID:186120 - 上次审阅时间:12/05/2015 08:42:04 - 修订版本: 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 标准版

  • kbnosurvey kbarchive kbmt kbautomation kbcode kbhowto kbinterop KB186120 KbMtzh
反馈