问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求C++对Excel的操作代码,谢谢

发布网友 发布时间:2022-04-24 17:20

我来回答

1个回答

热心网友 时间:2023-10-25 16:15

通过VC实现对Excel表格的操作的方法有多种,如:通过ODBC数据库实现,通过解析Excel表格文件,通过OLE/COM的实现。本文主要研究通过OLE/COM实现对Excel表格的操作。

本文源码的应用环境说明:
Windows XP SP3
Microsoft Visual Studio 2010
Microsoft Office Excel 2007

1、添加OLE/COM支持。
首先,应用程序必须添加对OLE/COM的支持,才能导入OLE/COM组件。
本文使用的是MFC对话框程序,在创建工程的向导中选中Automation选项即可为程序自动添加相应的头文件和OLE库初始化代码。
通过查看源代码,可以知道在stdafx.h的头文件中,添加了OLE/COM很多类所需添加的头文件。
#include<afxdisp.h> // MFC 自动化类
同时,在应用程序类的InitInstance函数中,添加了OLE/COM的初始化代码,如下所示:
// 初始化 OLE 库
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}

2、导入并封装Excel中的接口
Excel作为OLE/COM库插件,定义好了各类交互的接口,这些接口是跨语言的接口。VC可以通过导入这些接口,并通过接口来对Excel的操作。
由于本文只关心对Excel表格中的数据的读取,主要关注几个_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range等几个接口。Excel的各类接口的属性、方法可以通过MSDN的OfficeDevelopment进行查询。
VS2010导入OLE/COM组件的接口的步骤为:Project->Class Wizard->Add Class->MFC Class FromTypeLib,先选择要导入的组件所在的路径,即Excel.exe所在的路径,然后再选择
要导入的Excel类型库中的接口。
在完成接口导入后,VS2010将自动为导入的接口创建相应的实现类,用于对接口属性和方法的实现。由于标准的C++没有属性访问器,只能添加一个两个存取函数来实现对属性的访问,通过在属性名称前加上get_和put_前缀分别实现对属性的读写操作。即,由VC自动完成C++类对接口的封装。

本文所导入的接口对应的类和头文件的说明如下所示:

Excel接口

导入类

头文件

说明

_Application

CApplicaton

Application.h

Excel应用程序。

Workbooks

CWorkbooks

Workbooks.h

工作簿的容器,里面包括了Excel应用程序打开的所有工作簿。

_Workbook

CWorkbook

Workbook.h

单个工作簿。

Worksheets

CWorksheets

Worksheets.h

单个工作簿中的Sheet表格的容器,包括该工作簿中的所有Sheet。

_Worksheet

CWorksheet

Worksheet.h

单个Sheet表格。

Range

CRange

Range.h

一定数量的单元格,可对单元格进行单个或多个单元格进行操作。

3、导入Excel的整个类型库
接口对应类只是对接口的属性和方法进行了封装,而Excel中的数据类型,如枚举类型却并为并不能使用,因此,为了更方便的操作Excel,还需要导入Excel的数据类型。
通过查看导入接口对应的头文件可以发现,在所有导入接口的头文件中,都会有这么行:
#import "D:\\Program Files\\MicrosoftOffice\\Office12\\EXCEL.EXE" no_namespace
这行代码的作用是导入Excel整个类型库到工程中。
由VS2010自动产生的导入代码存在以下几个问题:
(1)如果导入了多个接口,每个头文件都会把类型库导入一次,如果引用多个头文件,会导致类型库重复导入。
(2)Excel类型库中有些类型会跟MFC类库的某些类型冲突。
(3)Excel类型库的某些类型跟其他Office和VB的某些库相关,如果不导入相关库,将导致这些类型无法使用。。
以上三点问题的解决方法如下:
(1)仅在_Application接口对应头文件中导入Excel类型库。
(2)对冲突的类型进行重命名。
(3)在导入Excel类型库之前,先导入Office和VB的相关库。
更改后的导入类型库的代码如下:

/*导入Office的类型库*/
#import "C:\\Program Files\\Common Files\\MicrosoftShared\\OFFICE12\\MSO.DLL" \
rename("RGB", "MSORGB")\
rename("DocumentProperties","MSODocumentProperties")
using namespace Office;

/*导入VB的类型库*/
#import "C:\\Program Files\\Common Files\\MicrosoftShared\\VBA\\VBA6\\VBE6EXT.OLB"
using namespace VBIDE;

/*导入Excel的类型库*/
#import "D:\\Program Files\\MicrosoftOffice\\Office12\\EXCEL.EXE" \
rename("DialogBox","ExcelDialogBox") \
rename("RGB","ExcelRGB") \
rename("CopyFile","ExcelCopyFile") \
rename("ReplaceText","ExcelReplaceText") \
no_auto_exclude
Using namespace Excel;

编译程序后,会在Debug或Release目录下生成三个文件mso.tlh、vbe6ext.tlh和excel.tlh。通过打开文件可知,该三个文件的命名空间分别是Office、VBIDE和Excel。导入了Excel的整个类型库后,就可以使用Excel中的所有类型了。

4、操作Excel步骤
操作Excel的主要步骤如下:
(1)创建一个Excel应用程序。
(2)得到Workbook的容器。
(3)打开一个Workbook或者创建一个Workbook。
(4)得到Workbook中的Worksheet的容器。
(5)打开一个Worksheet或者创建一个WorkSheet。
(6)通过Range对WorkSheet中的单元格进行读写操作。
(7)保存Excel。
(8)释放资源。

5、批量处理Excel表格
VC通过OLE/COM操作Excel,是通过进程间的组件技术。因此,每次读写Excel中的单元格时,都要进行进程间的切换。当数据量大,如果一个单元格一个单元格的读取,主要的时间都花费在进程切换中。因此读取多个单元格,将可有效的提高程序的运行效率。
对多个单元格的读写操作可以通过CRange中以下两个成员函数来完成。
VARIANT get_Value2();
voidput_Value2(VARIANT& newValue);
其中,输入参数newValue只要输入一个二维数组,即可实现向Excel中一次写入多个单元格的值。
其中,VARIANT中实现二维数据的方法可参考
http://www.cnblogs.com/xianyunhe/archive/2011/09/13/2174703.html
当然,在对CRange类进行操作之前,要设置CRange类对应的单元格。

6、Excel表格的保存
(1)如果要保存打开的工作簿,使用CWorkbook类的Save函数就可以保存工作簿,原文件将被覆盖。
(2)如果是新创建的工作簿,或者是要另存为,可使用CWorkbook类的SaveAs函数。
SaveAs的参数比较多。其中,第1个参数是设置要保存文件的路径;第2个参数是设置文件的格式,可在MSDN中查看枚举类型XlFileFormat来了解Excel的文件格式。经过测试,在本文所用的测试环境中,Excel2003的文件格式是xlExcel8,Excel2007的文件格式是xlExcel4。

7、获取当前Excel的版本
可以通过CApplication的get_Version函数来获得Excel的版本,其中,Excel2007的主版本号是12,Excel2003的主版本号是11。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
联想服务器u盘启动装系统教程视频 联想服务器如何做系统 三色翡翠手镯价格三色翡翠手镯是哪三种颜色 许昌天悦广场售楼热线是多少? 填食品生产许可证申请书时,申请人各项质量安全管理制度清单及其... 最新二手房网签合同范本 房地产网签合同范本 上海房地产网签合同怎么写 如何将数学题用程序解出答案? 数学:编写一个程序,输出数字1,2,3,4,5。 MFC怎么读写EXCEL文件 (牛人请进)如何通过c# 实现excel里面的“另存为”功能 c/c++怎样从excel中读取内容 C语言中怎样绘制Excel里那样的表格,麻烦说详细一点. c语言能对EXCEL数据进行操作吗 C/C++如何读取Excel的数据,并进行操作? MFC程序COM操作EXCEL时,获取合并单元格行、列时出现的问题 C/C++如何用COM来操作excel,求具体操作,越具体越好 十代雅阁1.5t高功率和高尔夫6代1.4t哪个猛? 听说雅阁十代这款车获年度车型了,值得购买吗? 2018款本田雅阁的车身重量是多少? 都说十代雅阁低速很轻快,想知道它自重多少? 购买手机办理分期需要用信用卡吗 网上购买手机分期付款是必须要用信用卡吗 买手机分期付款一定要用信用卡吗? 分期付款买手机必须信用卡吗 分期付款买手机一定要用信用卡吗 女生十七岁的生日应该送什么 不用信用卡怎么分期买手机 手机办理分期必须用银行卡吗? 用c语言的知识可以将excel表格中的一列数据提取出来吗?具体怎么做呢 请问能在excel里做c chart么, 怎么做呢 excel中的编程和c语言编程是不是一样?有何区别? 成都有宝路华专卖店么 在吉林或长春有宝路华手表专卖店么? IPAD2 3G版 安装什么卡? 想从TVSN网站买一块瑞士宝路华 手表,请问质量和牌子如何? 宝路华电池那里有换? 那个知道bulova accutron 65A103这块表多少钱! 这款瑞士bulova手表5300入手值吗?宝路华手表质量好吗? omega手表报价 笔记本想在硬盘位上ssd,原硬盘用光驱硬盘托架装在光驱位,求详细操作方法。 笔记本光驱位硬盘托架怎么换固态啊? 笔记本电脑光驱位在安装机械硬盘的时候需要拆卸那些东西? 使用光驱位硬盘托架安装固态硬盘的操作复杂吗?自己动手能不能完成? 1第纳尔=多少人民币? 第纳尔等于多少人民币 克罗地亚1第纳尔等于多少人民币 笔记本光驱位托架固定机械硬盘用什么螺丝 南斯拉夫500亿第纳尔相当于多少人民币