首先在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程序对照一下,回头再讨论这个问题吧!啊!哈---依呀累死我了!!

用VC调用EXCEL简单代码(转载自越长大越孤单,觉得很好)的更多相关文章

  1. C#调用Excel VBA宏[转载]

    原文地址:https://www.cnblogs.com/heekui/archive/2008/03/30/1129355.html 近日的一系列工作是做网站的营运维护,因此做了大量的支持工具.有E ...

  2. http-get调用接口简单代码

    一.简单便捷的httpget调用接口,并且返回接口数据1.导入相应的jar包: 2.代码如下: HttpGet get=null; try {HttpClient httpClient = new D ...

  3. http-post调用接口简单代码

    一.简单便捷的httpget调用接口,并且返回接口数据1.导入相应的jar包: 2.代码如下: HttpPost post = null; try { HttpClient httpClient = ...

  4. VC操作Excel之基本操作(颜色等)【转载】

    文章出处https://blog.csdn.net/form88/article/details/78566390 EXCEL里如何知道某种颜色的ColorIndex的值 ===fag::====== ...

  5. JNI_最简单的Java调用C/C++代码

    JNI_最简单的Java调用C/C++代码 JNI.是Java Native Interface的简称,中文是"Java本地调用".通过这种技术能够做到下面两点: Java程序中的 ...

  6. 除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛

    MainWindow::MainWindow(QWidget *parent) :   QMainWindow(parent)   {   pThreadCon = new CSerialThread ...

  7. Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)

    利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度.缩短开 ...

  8. Winform 导出成Excel打印代码

    WinForm中 直接调用Excel的打印预览功能,但不显示Excel文件 using Microsoft.Office.Interop.Excel; //引用 public void PrintPr ...

  9. C#调用存储过程简单完整例子

    CREATE PROC P_TEST@Name VARCHAR(20),@Rowcount INT OUTPUTASBEGIN SELECT * FROM T_Customer WHERE NAME= ...

随机推荐

  1. shell中创建mysql库和执行sql脚本

    以前执行oracle脚本都是放到plsql中执行 mysql 脚本执行: (1).先创建一个worlddb库 (2).导入sql脚本: 这就ok啦,哈哈.

  2. bizagi simulation 仿真学习

    Level 1 - Process Validation 1. maximum arrival count Define the number of token instances the proce ...

  3. Ubuntu无法识别显示器情况下,高分辨率的设置

    安装ubuntu后,出现无法识别显示器,从而造成无法设置高分辨率. 界面显示似老年机般,5.3的视力+强迫症,臣妾的内心是十分拒绝的,捣鼓了半天终于搞定,这里记录下方法. (一)使用xrandr命令, ...

  4. 深度剖析Linux与Windows系统的区别

    当我们每个人接触Linux之前,应该先接触的都是windows吧?但我们一般接触Linux后,习惯linux的管理和使用方法后,我们再回过头再来使用windows的时候,内心其实是拒绝的.我们会觉得图 ...

  5. DeepLearning之路 (五) CNN

    自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN),期间配置和使用过theano和cuda-convnet.cuda-convnet2. ...

  6. GDI与GDI+ 贴图性能对比

    在做绘图相关工作,由于对显示绘制结果实时性有要求,筛选了GDI , 与GDI+ 贴图性能. 这里假设在内存中已绘制完成一张图片,现需求显示在控件上,同时,总是更新全部区域. GDI+ 实现 priva ...

  7. Bootstrap<基础十一>字体图标(Glyphicons)

    字体图标(Glyphicons),并通过一些实例了解它的使用.Bootstrap 捆绑了 200 多种字体格式的字形. 获取字体图标 我们已经在 环境安装 章节下载了 Bootstrap 3.x 版本 ...

  8. python学习08——类

    笨办法学python第42节,这节讲的是类,程序沿用上一节中一个游戏,不同的是这一节用了类的方法. 其中改动的代码主要如下 原来的最后几句用了这样的代码: ROOMS = { 'death':deat ...

  9. Visor 应用之一 通过ER 设计生成数据库脚本和实体对象

    前言 Visor(http://www.visor.com.cn)   是一个基于HTML5 Canvas 开发的IDE 框架和设计开发平台,有关Visor的设计架构和技术应用,在以后的文章里会逐渐跟 ...

  10. ArcEngine 栅格数据

    1.ArcEngine中的栅格数据组织方式(详细信息见:http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#/na/009t0000 ...