如何自动执行 Excel 使用 MFC 和工作表函数

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

本文内容

概要

本文介绍如何通过使用 Microsoft 基础类 (MFC) 库 (安装与 Microsoft Visual c + + 版本 5.0 和 6.0) 的 4.2 版自动 Microsoft Excel 97、 Microsoft Excel 2000、 Microsoft Excel 2002,或 Microsoft Excel 2003。专门,这篇文章说明了如何使用工作表函数提供的外接程序如分析工具库 (ATP) 以及如何使用的是内置到 Microsoft Excel 工作表公式函数。

更多信息

您可以将本文中的代码复制到消息处理函数,MFC.cpp 文件中定义的事件。但是,代码的目的是为了说明使用 IDispatch 接口并在 Excel 97 和 Excel 2002 和 Excel 2003 类型库的 Excel.exe Excel9.olb 为 Excel 2000 中为 Excel8.olb 中定义的成员函数的过程。主要优点来自于阅读和理解在该的示例代码,以便您可以修改该示例或自动化中使用 MFC 的 Microsoft Excel 工作表函数从头开始编写代码。

创建项目的步骤

  1. 请按照步骤 1 到 12,在下面的 Microsoft 知识库文章,以创建使用 IDispatch 接口和 Excel8.olb,或 Excel9.olb 或 Excel.exe Excel 2002 和 Excel 2003 类型库中定义的成员函数的示例项目中:
    178749如何创建自动化项目使用 MFC 和类型库
  2. 在 AutoProjectDlg.cpp 顶部添加以下行:
          #include "excel8.h"
    					
    如果您自动化 Excel 2000,包括 excel9.h。如果您自动化 Excel 2002 或 Excel 2003,包括 excel.h

  3. 将下面的代码添加到 CAutoProjectDlg::OnRun() AutoProjectDLG.cpp 文件中: 示例代码:
          try
          {
          _Application app;     // app is an _Application object.
          _Workbook book;       // More object declarations.
          _Worksheet sheet;
          Workbooks books;
          Worksheets sheets;
    
          Range range;          // Used for Microsoft Excel 97 components.
          LPDISPATCH lpDisp;    // Often reused variable.
    
          // Common OLE variants. Easy variants to use for calling arguments.
          COleVariant
            covTrue((short)TRUE),
            covFalse((short)FALSE),
            covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    
          // Start Microsoft Excel, get _Application object,
          // and attach to app object.
          if(!app.CreateDispatch("Excel.Application"))
           {
            AfxMessageBox("Couldn't CreateDispatch() for Excel");
            return;
           }
    
    
          // Set visible.
          app.SetVisible(TRUE);
    
          // Register the Analysis ToolPak.
          CString sAppPath;
    
          sAppPath.Format ("%s\\Analysis\\Analys32.xll", app.GetLibraryPath());
    
          if(!app.RegisterXLL(sAppPath))
            AfxMessageBox("Didn't register the Analys32.xll");
    
          // Get the Workbooks collection.
          lpDisp = app.GetWorkbooks();     // Get an IDispatch pointer.
          ASSERT(lpDisp);
          books.AttachDispatch(lpDisp);    // Attach the IDispatch pointer
                                           // to the books object.
    
          // Open a new workbook and attach that IDispatch pointer to the
          // Workbook object.
          lpDisp = books.Add( covOptional );
          ASSERT(lpDisp);
          book.AttachDispatch( lpDisp );
    
             // To open an existing workbook, you need to provide all
             // arguments for the Open member function. In the case of 
             // Excel 2002 you must provide 16 arguments.
             // However in Excel 2003 you must provide 15 arguments.
             // The code below opens a workbook and adds it to the Workbook's
             // Collection object. It shows 13 arguments, required for Excel
             // 2000.
             // You need to modify the path and file name for your own
             // workbook.
    
          // 
          // lpDisp = books.Open("C:\\Test",     // Test.xls is a workbook.
          // covOptional, covOptional, covOptional, covOptional, covOptional,
          // covOptional, covOptional, covOptional, covOptional, covOptional,
          // covOptional, covOptional );   // Return Workbook's IDispatch
          // pointer.
    
          // Get the Sheets collection and attach the IDispatch pointer to your
          // sheets object.
          lpDisp = book.GetSheets();
          ASSERT(lpDisp);
          sheets.AttachDispatch(lpDisp);
    
          // Get sheet #1 and attach the IDispatch pointer to your sheet
          // object.
          lpDisp = sheets.GetItem( COleVariant((short)(1)) );
                                            //GetItem(const VARIANT &index)
          ASSERT(lpDisp);
          sheet.AttachDispatch(lpDisp);
    
          // Fill range A1 with "1/25/98", the settlement date.
          lpDisp = sheet.GetRange(COleVariant("A1"), COleVariant("A1"));
          ASSERT(lpDisp);
          range.AttachDispatch(lpDisp);
          range.SetValue(COleVariant("1/25/98")); // Excel 97 & Excel 2000
    
    range.SetValue2(COleVariant("1/25/98")); // Excel 2002 and Excel 2003
    
    
          // Fill range A2 with "11/15/99", the maturity date.
          lpDisp = sheet.GetRange(COleVariant("A2"), COleVariant("A2"));
          ASSERT(lpDisp);
          range.AttachDispatch(lpDisp);
          range.SetValue(COleVariant("11/15/99"));  // Excel 97 & Excel 2000
    
    range.SetValue2(COleVariant("11/15/99")); // Excel 2002 and Excel 2003
    
    
          // Fill range A3 with "2", the frequency for semi-annual interest
          // payments.
          lpDisp = sheet.GetRange(COleVariant("A3"), COleVariant("A3"));
          ASSERT(lpDisp);
          range.AttachDispatch(lpDisp);
          range.SetValue(COleVariant("2"));  // Excel 97 & Excel 2000
    
    range.SetValue2(COleVariant("2"));  // Excel 2002 and Excel 2003
    
          // Fill range A4 with 1, the basis (actual/actual).
          lpDisp = sheet.GetRange(COleVariant("A4"), COleVariant("A4"));
          ASSERT(lpDisp);
          range.AttachDispatch(lpDisp);
          range.SetValue(COleVariant("1")); // Excel 97 & Excel 2000
    
    range.SetValue2(COleVariant("1")); // Excel 2002 and  Excel 2003
    
          // Fill range C1 with the formula "=COUPNCD(A1, A2, A3, A4)" and
          // format the cell with a Date type of the Number format.
          lpDisp = sheet.GetRange(COleVariant("C1"), COleVariant("C1"));
          ASSERT(lpDisp);
          range.AttachDispatch(lpDisp);
          range.SetNumberFormat(COleVariant("mm/dd/yy"));
          range.SetFormula(COleVariant("=COUPNCD(A1, A2, A3, A4)"));
    
          /* This is an alternative that works without placing variables on
          // the worksheet.
          // The values are arguments contained in the SetFormula() call.
          // range.SetFormula(COleVariant(
                           "=COUPNCD(\"09/15/96\",\"11/15/99\",2,1)"));
          */ 
    
          // *** The example in this block uses a built-in Microsoft Excel
          // function.
    
          // You do not have to register any add-in to use the built-in
    
          // Microsoft Excel worksheet functions.
          lpDisp = sheet.GetRange(COleVariant("C3"), COleVariant("C3"));
          ASSERT(lpDisp);
          range.AttachDispatch(lpDisp);
          range.SetFormula(COleVariant("=SUM(A3, A4)"));
          // or use:
          // range.SetFormula(COleVariant("=SUM(2,1)"));
    
          // *** End of example for built-in function usage.
    
          // Release dispatch pointers.
          range.ReleaseDispatch();
          sheet.ReleaseDispatch();
          // This is not really necessary because
          // the default second parameter of AttachDispatch releases
          // when the current scope is lost.
    
          } // End of processing.
    
            catch(COleException *e)
          {
            char buf[1024];     // For the Try...Catch error message.
            sprintf(buf, "COleException. SCODE: %08lx.", (long)e->m_sc);
            ::MessageBox(NULL, buf, "COleException", MB_SETFOREGROUND | MB_OK);
          }
    
          catch(COleDispatchException *e)
          {
            char buf[1024];     // For the Try...Catch error message.
            sprintf(buf,
                   "COleDispatchException. SCODE: %08lx, Description: \"%s\".",
                   (long)e->m_wCode,(LPSTR)e->m_strDescription.GetBuffer(512));
            ::MessageBox(NULL, buf, "COleDispatchException",
                               MB_SETFOREGROUND | MB_OK);
          }
    
          catch(...)
          {
            ::MessageBox(NULL, "General Exception caught.", "Catch-All",
                               MB_SETFOREGROUND | MB_OK);
          }
    					

参考

有关自动化的 Office 应用程序的其他信息,请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
222101如何: 查找和使用 Office 对象模型文档

属性

文章编号: 178781 - 最后修改: 2007年2月12日 - 修订: 4.2
这篇文章中的信息适用于:
  • Microsoft Foundation Class Library 4.2?当用于
    • Microsoft Visual C++ 5.0 标准版
    • Microsoft Visual C++ 6.0 Service Pack 5
    • Microsoft Excel 97 标准版
  • Microsoft Excel 2002 标准版
关键字:?
kbmt kbautomation kbhowto kbinterop KB178781 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 178781
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