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

vc大量读excel单元格

发布网友 发布时间:2023-02-24 23:44

我来回答

1个回答

热心网友 时间:2023-07-29 01:32

通过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的Office Development进行查询。

VS2010导入OLE/COM组件的接口的步骤为:Project->Class Wizard->Add Class->MFC Class From TypeLib,先选择要导入的组件所在的路径,即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\\Microsoft Office\\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\\Microsoft Shared\\OFFICE12\\MSO.DLL" \

rename("RGB", "MSORGB") \

rename("DocumentProperties", "MSODocumentProperties")

using namespace Office;

/*导入VB的类型库*/

#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"

using namespace VBIDE;

/*导入Excel的类型库*/

#import "D:\\Program Files\\Microsoft Office\\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();

void put_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。

8、示例源代码

主要代码如下:

m_ListCtrl.SetExtendedStyle(LVS_REPORT | LVS_EX_FULLROWSELECT);

    CApplication ExcelApp;
    CWorkbooks books;
    CWorkbook book;
    CWorksheets sheets;
    CWorksheet sheet;
    CRange range;
    LPDISPATCH lpDisp = NULL;

    //创建Excel 服务器(启动Excel)
    if(!ExcelApp.CreateDispatch(_T("Excel.Application"),NULL))
    {
        AfxMessageBox(_T("启动Excel服务器失败!"));
        return -1;
    }
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
膀胱癌医生要为什么要检查上尿路? 游览器书签怎样添加到手机桌面 玫瑰花是早上开还是晚上开 玫瑰是晚上开花吗 左拾遗是什么官左拾遗的解释 怎样炖羊肉好吃又烂 怎样炖羊肉软烂无膻味好吃 ...之心度君子之腹的意思以小人之心度君子之腹的解释以小人之心度君子... 以小人之心度君子之腹什么意思以小人之心度君子之腹出处介绍 苹果macbook pro开机音乐是什么 苹果台式电脑声音苹果电脑开机声音怎么设置 衣服大小合适但是手抬不起来 worksheetfiles文件怎么保存 大衣抬手困难 梦见家里变富裕有佣人有狗 梦到报警嗓子哑什么意思 女人梦见自己嗓子哑了是什么意思 相伴左右?猜生肖 一七二十永相伴的动物打一生肖 永相伴是什么动物生肖? 大和小只是说它是一个负数和正数的问题。只有资本和注册资本的... 智能拼音输入法必备的技巧 网站根目录放什么文件? 梦见女友怀孩子 为什么有些人不发微信朋友圈? 为什么现在的人不发微信朋友圈了? 你为什么不发微信朋友圈了? 艾瑞泽8冷风为什么一直自动打开 艾瑞泽5暖风怎么开都是对胸吹,怎么回事 奇瑞艾瑞泽电动汽车电加热咋样打开 梦见被公司解雇了 c#保存excel以固定路径和文件名 请问哪位大师知道梦见牡丹图上面还有一个佣人和一段墙是预示什么啊 做梦梦见老公逝世了是什么意思 梦见老公和人走了 梦见狗来回追我 梦见自己请客,老公走了什么意思 梦见老公走了我叫儿子去找外婆是什么意思 梦见黑人在家里什么意思? 梦见黑人小男孩进屋子里 imac272017是原生10位色深吗 梦见有黑人影孑 梦见手黑人家不愿和我握手 梦见黑人突然从家里出没,被发现,他说自己只是俏俏的看看杂志,吃吃饭是什么意思 梦见黑人劳动 doct选项在哪里 梦见有女人来纠缠丈夫梦到有女人来纠缠丈夫是什么意思 张玲玉和张玉芹那个寓意好 如何给殷姓女宝宝起名? 梦见灰色的眼睛是什么预兆? 梦见灰色的眼睛什么意思?