时光飞逝~

用VC调用EXCEL简单代码(转载自越长大越孤单,觉得很好)

首先在stdafx.h里加入对IDispatch接口提供支持的头文件:

 #include 《afxDisp.h》

 再在应用程序类的InitInstance()函数里加入:

 AfxOleInit(); // 初始化OLE Automation库

 我们应该怎么引用Excel对象库呢?按Ctrl+W启动Class Wizard,

 再选择“Add Class...”->“From a type library...”,然后

 选择“c:\program files\microsoft office\office”目录下的

 “Excel8.olb”,随后在“confirm classes”对话框的List box

 中将列出所有Excel8对象库中可用的对象。按住ctrl键再用箭头

 选中Sheets、_Application、_Worksheet、_Workbook、Workbooks、

 Range几个对象,按确定。哈!你看到在ClassView窗口中多出的

 几个类吗?现在Excel就可以任由我们摆布啦!

 好了,VC的灵话性在这儿将会体现出来了,我们生成的几个Excel

 对象有很多已定义好的函数,但它们可能并不完全适合我们,哈!

 我们可以跟据需要来修改这些函数!!当然不能乱改,前提是我

 们必须对Excel VBA有详细的了解!

比如Workbooks类中的Add函数有一个Template参数用于指定模板文

件,但大多数情况我们用不着模板文件,怎么办呢?你是否记得在

VBA中这个参数是一个可选项?那就改呗!我们可以用C++的特性,

重载这个函数!在左边的Workbooks上右键->“Add member

function...”,然后在function type中输入“LPDISPATCH”,在

fucntion declaration输入“Add()”然后按OK。然后按如下方法

编辑该函数,大家看到,我们只是将Template参数去掉了,然而

继续保留对InvokeHelper的调用,请别忘记,MFC自动化类通常都

是从COleDispatchDriver派生的。

 LPDISPATCH Workbooks::Add()

 {

    LPDISPATCH result;

    InvokeHelper(0xb5, DISPATCH_METHOD, VT_DISPATCH,

    (void*)&result, NULL);

    return result;

 }

为对话框上的按钮生成一个函数吧,我们要写VC代码了!别忘了在

对话框的实现文件中加入#include"excel8.h"呀!

准备好了吗?代码如下!!!!!

 void CExcelOleDlg::OnButton1()

 {

    LPDISPATCH      pDispatch = NULL;

    LPUNKNOWN       pUnknown = NULL;

    CLSID      clsid;

    _Application    appExcel;

    LPDISPATCH      pWorkbooks = NULL;

    Workbooks       Workbooks;

    LPDISPATCH      pWorkbook = NULL;

    LPDISPATCH      pWorksheets = NULL;

    Sheets     Worksheets;

    LPDISPATCH      pWorksheet = NULL;

    _Worksheet      Worksheet;

    LPDISPATCH      pWorkRange = NULL;

    Range      WorkRange;

    CLSIDFromProgID( L"Excel.Application.8", &clsid );

    // 看指定的对象是否已经运行

    if ( SUCCEEDED(GetActiveObject(

         clsid, NULL, &pUnknown )) )

    {

        VERIFY( SUCCEEDED(pUnknown->QueryInterface(

            IID_IDispatch, (void**)&pDispatch )) );

        ASSERT( pDispatch );

        appExcel.AttachDispatch( pDispatch );

        pUnknown->Release();

    }

    else

    {

        // 没运行。那就建立Excel.Application.8对象

        if ( ! appExcel.CreateDispatch(

            (LPCTSTR)"Excel.Application.8") )

        {

           MessageBox(

           "can not found the Excel.Application.8 object!");

           return;

        }

    }

    // 显示并激活Excel窗口

    // XLMAIN 是用Spy++查到的

    HWND hWndExcelMain = ::FindWindow( "XLMAIN", NULL );

    ASSERT( hWndExcelMain );

    ::ShowWindow( hWndExcelMain, SW_SHOW );

    ::UpdateWindow( hWndExcelMain );

    ::BringWindowToTop( hWndExcelMain );

    // 设置在一个新工作簿中的工作表数为1

    appExcel.SetSheetsInNewWorkbook( 1 );

    // 得到工作簿集的IDispatch,并绑定到Workbooks对象

    pWorkbooks = appExcel.GetWorkbooks();

    ASSERT( pWorkbooks );

    Workbooks.AttachDispatch( pWorkbooks );

    // 如果工作簿集是空的,那就添加一个工作簿

    if ( Workbooks.GetCount() == (long)0 )

    {

        pWorkbook = Workbooks.Add();

        ASSERT( pWorkbook );

    }

    // 得到工作表集(同上)

    pWorksheets = appExcel.GetWorksheets();

    ASSERT( pWorksheets );

    Worksheets.AttachDispatch( pWorksheets );

    // 激活第一个工作表

    pWorksheet = Worksheets.GetItem(

        COleVariant((short)1) );

    ASSERT( pWorksheet );

    Worksheet.AttachDispatch( pWorksheet );

    Worksheet.Select( COleVariant((short)TRUE) );

    // 得到A1区域的引用

    pWorkRange = Worksheet.GetRange(

        COleVariant("A1"), COleVariant("A1"));

    WorkRange.AttachDispatch( pWorkRange );

    WorkRange.SetValue(

        COleVariant("多简单!就是麻烦一点儿!") );

    if ( pWorkbook )

        pWorkbook->Release();

 }

请注意,上述代码中除了了加入错误检查之外,还判断指定的对象是否已经

运行,如果已经运行则直接引用该对象,否则才建立新对象,其它的和上面

VB程序的功能相同!!!竟然多了这么多代码,真让人不可思议!

快累死我了!我是实在没力气解释这段VC程序了,感兴趣的朋友可以拿它和

上面的VB程序对照一下,回头再讨论这个问题吧!啊!哈---依呀累死我了!!

 

posted on 2013-08-29 22:39  时光飞逝~  阅读(544)  评论(0)    收藏  举报