《VC++操作EXCEL表格,附带两个小例子》由会员分享,可在线阅读,更多相关《VC++操作EXCEL表格,附带两个小例子(13页珍藏版)》请在金锄头文库上搜索。
1、C+读取 Excel 的 XLS 文件的方法有很多,但是也许就是因为方法太多,大家在选择的时候会很疑惑。由于前两天要做导表工具,比较了常用的方法,总结一下写个短文,1.OLE 的方式这个大约是最常用的方式,这个方式其实启动了一个EXCEL 的进程在背后读写EXCEL文件,这个方式的最大好处是什么事情都能做。包括设置EXCEL 的格式,增加删除Sheet,读写单元格,等等。功能几乎是最全的,而且使用起来也不是特别的难。其基本方法都是使用导出的.h 文件进行 OLE 操作,但是由于 OLE 的接口说明文档不多,想非常完美的使用她们也不是太容易,好在例子也很多。网上普遍认为OLE 速度慢, EXCE
2、L 的 OLE 读写方式也基本一样。但是读取速度可以改进,如果在读取的加载整个Sheet的 Range的全部数据,而不是一个个单元格读取,那么速度还是相对不错。想想原理也很简单,整体读取减少了OLE 的交互次数。 OLE 的写入方式一般只能几个进行比较方便,所以速度可能要快很多。我自己的亲身体会是,一个EXCEL 文件, 100 多列的字段,如果采用一个个单元格的读取方式, 1s 大约 3 条左右的记录,如果整体读取,速度可以提高几十倍。OLE 读写 EXCEL 方式功能很强大,读取速度还可以,但写入速度不高,当然这个方式不可能移植的,而且你必须安装了EXCEL 。2.Basic EXCEL
3、方式这是 CodeProject 上的一个推荐开源工程了,http:/ 作者是基于EXCEL 的文件格式进行的处理。但是为什么叫Basic EXCEL 呢。他不支持很多东西,公式,文件格式,表格合并等(有人说中文支持也不好),所以可以认为他只支持最基本的EXCEL 表格,我自己的尝试是如果这个EXCEL 文件有其他元素(公式,格式等) ,使用 Basic EXCEL 读取会失败。OLE 读写 EXCEL 方式功能比较弱,由于是直接根据文件格式操作,读写速度都不错,你也不需要按照EXCEL ,另外这个方式是可以移植的,但是有一些成本,其代码比较晦涩难懂,而且没有注释,另外即使在Windows 平
4、台上,告警也很多。3.Sourceforge 上的几个EXCEL 库。Sourceforge 上有几个开源的的EXCEL库,但是完善的不多,有的是为了PHP 读写EXCEL准备的,包括libXLS ,XLSlib ,SmartEXCEL等。我下载了几个实验了一下,在Widonws 都没有编译成功。也罢了。4.ODBC 的方式这个亲身没有尝试过,但是按照原理, 应该只能读写。速度吗, ODBC 的速度本来就是出名的慢了。http:/ 的方式ADO 的方式听说应该就是使用OLEDB 的方式。和OLE 的方式应该没有本质区别。我看了看例子也和OLE 很像6.LibXL LibXL 是一个收费的EXC
5、EL 的库。http:/ 按照他的说明,他可以不依赖EXCEL 读取 XLS 文件。包括设置格式等。看例子操作应该很简单。但是是否可以移植到Linux 平台,我估计难度也不小。呵呵。由于要收费,没有法子测试了。7.网上一些号称不用OLE 读取 EXCEL 例子初步看了一下,这个应该是网上探索EXCEL 格式文档的例子。可以实际操作的方式不强。一、直接通过 ODBC 读、写 Excel 表格文件首先,我们要明白的是,VC 是通过 ODBC 来访问 Excel 表格的,也就是说,VC 将 Excel表格,当作数据库来处理。当然了,也可以通过读以tab 键隔开的文件来处理这样的文件,但是,我还是更加
6、愿意用读取数据库的方式来访问Excel 表格。第二,既然是数据库,那么,就需要建立一个与该库对应的dsn,这个,而且,在建立dsn之前,首先要确定,已经安装了Excel 的驱动。第三,要访问数据库中的表格,就要先打开该表格,如此,就需要一个与之对应的RecordSet 想要通过ODBC 直接读、写Excel 表格文件,首先,应确保ODBC 中已安装有Excel 表格文件的驱动 “MICROSOFT EXCEL DRIVER (*.XLS)“。然后,可根据下面步骤进行:1. 在 StdAfx.h 文件中加入:#include #include 2. 通过 ODBC 直接创建Excel 文件 (暂
7、定文件名: Demo.xls)/创建并写入Excel 文件void CRWExcel:WriteToExcel() CDatabase database; CString sDriver = “MICROSOFT EXCEL DRIVER (*.XLS)“; / Excel安装驱动CString sExcelFile = “c:demo.xls“; / 要建立的Excel 文件CString sSql; TRY / 创建进行存取的字符串sSql.Format(“DRIVER=%s;DSN=;FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=“%s“;DBQ
8、=%s“,sDriver, sExcelFile, sExcelFile); / 创建数据库 (既 Excel 表格文件 ) if( database.OpenEx(sSql,CDatabase:noOdbcDialog) ) / 创建表结构 (姓名、年龄 ) sSql = “CREATE TABLE demo (Name TEXT,Age NUMBER)“; database.ExecuteSQL(sSql); / 插入数值sSql = “INSERT INTO demo (Name,Age) V ALUES ( 徐景周 ,26)“; database.ExecuteSQL(sSql); s
9、Sql = “INSERT INTO demo (Name,Age) V ALUES ( 徐志慧 ,22)“; database.ExecuteSQL(sSql); sSql = “INSERT INTO demo (Name,Age) VALUES ( 郭徽 ,27)“; database.ExecuteSQL(sSql); /sSql = L“INSERT INTO Grade (序号 ,射杀方 ,被射杀方 ,时间 ) VALUES (“ + mStr0 + L“,“ + mStr1 +L“,“ + mStr2 +L“,“ + mStr3 +L“)“; mStr0 为字符串类型 / 关闭数
10、据库database.Close(); CATCH_ALL(e) TRACE1(“Excel驱动没有安装 : %s“,sDriver); END_CATCH_ALL; 3. 通过 ODBC 直接读取Excel 文件 (暂定文件名: Demo.xls)/ 读取 Excel 文件void CRWExcel:ReadFromExcel() CDatabase database; CString sSql; CString sItem1, sItem2; CString sDriver; CString sDsn; CString sFile = “Demo.xls“; / 将被读取的Excel 文件
11、名/ 检索是否安装有Excel 驱动 “Microsoft Excel Driver (*.xls)“ sDriver = GetExcelDriver(); if (sDriver.IsEmpty() / 没有发现 Excel 驱动AfxMessageBox(“ 没有安装Excel 驱动 !“); return; / 创建进行存取的字符串sDsn.Format(“ODBC;DRIVER=%s;DSN=;DBQ=%s“, sDriver, sFile); TRY / 打开数据库 (既 Excel 文件 ) database.Open(NULL, false, false, sDsn); CRe
12、cordset recset( / 设置读取的查询语句.注意此处表名的写法,excel 里的表默认为系统表,所以访问表时表明应为 表明 $ sSql = “SELECT Name, Age “ “FROM demo “ “ORDER BY Name “; / 执行查询语句recset.Open(CRecordset:forwardOnly, sSql, CRecordset:readOnly); / 获取查询结果while (!recset.IsEOF() /读取 Excel 内部数值recset.GetFieldValue(“Name “, sItem1); recset.GetFieldV
13、alue(“Age“, sItem2); / 移到下一行recset.MoveNext(); / 关闭数据库database.Close(); CATCH(CDBException, e) / 数据库操作产生异常时. AfxMessageBox(“ 数据库错误 : “ + e-m_strError); END_CATCH; 4. 获取 ODBC 中 Excel 驱动函数CString CRWExcel:GetExcelDriver() char szBuf2001; WORD cbBufMax = 2000; WORD cbBufOut; char *pszBuf = szBuf; CStri
14、ng sDriver; / 获取已安装驱动的名称(涵数在 odbcinst.h 里) if (!SQLGetInstalledDrivers(szBuf, cbBufMax, / 检索已安装的驱动是否有Excel. do if (strstr(pszBuf, “Excel“) != 0) /发现 ! sDriver = CString(pszBuf); break; pszBuf = strchr(pszBuf, 0) + 1; while (pszBuf1 != 0); return sDriver; 二、通过 OLE/COM实现对 Excel表格的操作1、添加 OLE/COM 支持。首先,
15、应用程序必须添加对OLE/COM 的支持,才能导入OLE/COM 组件。本文使用的是MFC 对话框程序, 在创建工程的向导中选中Automation 选项即可为程序自动添加相应的头文件和OLE 库初始化代码。通过查看源代码,可以知道在stdafx.h 的头文件中,添加了OLE/COM 很多类所需添加的头文件。#include / MFC 自动化类同时,在应用程序类的InitInstance 函数中,添加了OLE/COM 的初始化代码,如下所示:/ 初始化OLE 库if (!AfxOleInit() AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; 2、导入并封装Excel 中的接口Excel 作为 OLE/COM库插件,定义好了各类交互的接口,这些接口是跨语言的接口。VC可以通过导入这些接口,并通过接口来对Excel 的操作。由于本文只关心对Excel 表格中的数据的读取,主要关注几个_Application 、Work