用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程序对照一下,回头再讨论这个问题吧!啊!哈---依呀累死我了!!
用VC调用EXCEL简单代码(转载自越长大越孤单,觉得很好)的更多相关文章
- C#调用Excel VBA宏[转载]
原文地址:https://www.cnblogs.com/heekui/archive/2008/03/30/1129355.html 近日的一系列工作是做网站的营运维护,因此做了大量的支持工具.有E ...
- http-get调用接口简单代码
一.简单便捷的httpget调用接口,并且返回接口数据1.导入相应的jar包: 2.代码如下: HttpGet get=null; try {HttpClient httpClient = new D ...
- http-post调用接口简单代码
一.简单便捷的httpget调用接口,并且返回接口数据1.导入相应的jar包: 2.代码如下: HttpPost post = null; try { HttpClient httpClient = ...
- VC操作Excel之基本操作(颜色等)【转载】
文章出处https://blog.csdn.net/form88/article/details/78566390 EXCEL里如何知道某种颜色的ColorIndex的值 ===fag::====== ...
- JNI_最简单的Java调用C/C++代码
JNI_最简单的Java调用C/C++代码 JNI.是Java Native Interface的简称,中文是"Java本地调用".通过这种技术能够做到下面两点: Java程序中的 ...
- 除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { pThreadCon = new CSerialThread ...
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)
利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度.缩短开 ...
- Winform 导出成Excel打印代码
WinForm中 直接调用Excel的打印预览功能,但不显示Excel文件 using Microsoft.Office.Interop.Excel; //引用 public void PrintPr ...
- C#调用存储过程简单完整例子
CREATE PROC P_TEST@Name VARCHAR(20),@Rowcount INT OUTPUTASBEGIN SELECT * FROM T_Customer WHERE NAME= ...
随机推荐
- 0525 Scrum 项目 7.0
Sprint回顾 让我们一次比一次做得更好. 1.回顾组织 主题:“我们怎样才能在下个sprint中做的更好?” 时间:设定为1至2个小时. 参与者:整个团队. 场所:能够在不受干扰的情况下讨论. ...
- APACHE 在windows下的配置
目前apache在windows下只支持到2.2 所以php必须下载相应的线程安全的 然后打开apache的配置页面 listen directory 和 load_module修改 httpd -k ...
- Visual Studio Code中文文档(一)-快速入门
Visual Studio Code是一个轻量级但是十分强大的源代码编辑器,重要的是它在Windows, OS X 和Linux操作系统的桌面上均可运行.Visual Studio Code内置了对J ...
- 通过Maven插件发布JaveEE项目到tomcat下
1.修改tomcat\conf\tomcat-users.xml文件,在文件中增加 <role rolename="manager-script"/> <user ...
- js Date 函数方法 和 移动端数字键盘调用
var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...
- SpringAOP实现(原理)
AOP原理: AOP分为:JDK动态代理和CGLIB代理 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 注 ...
- 对git的认识
对git这个词我听过但不了解,更谈不了认识.只能咨询百度了. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮 ...
- Eclipse 常用快捷键
Ctrl + Shift + L : 可以查看快捷键方式 Ctrl + 1 : 快速修复 Ctrl + / : 注释当前行 Ctrl + D : 删除当前行 Shift + Enter : 可以在当 ...
- Django的单元测试
1.单元测试框架 django-unittest https://docs.djangoproject.com/en/1.9/topics/testing/overview/#speeding-up- ...
- RASPBERRY PI wifi配置
Raspberry Pi 手把手教你在树莓派上安装USB无线网卡支持WIFI 树莓派虽然已经有了有线网卡,但是并未配置无线网卡,移动性不够强,好在机器配备了2个USB口,当然要分一个出来给WIFI无线 ...