《VC操作EXCEL表格附带两个小例子.doc》由会员分享,可在线阅读,更多相关《VC操作EXCEL表格附带两个小例子.doc(13页珍藏版)》请在金锄头文库上搜索。
1、C+读取Excel的XLS文件的方法有很多,但是也许就是因为方法太多,大家在选择的时候会很疑惑。由于前两天要做导表工具,比较了常用的方法,总结一下写个短文,1. OLE的方式这个大约是最常用的方式,这个方式其实启动了一个EXCEL的进程在背后读写EXCEL文件,这个方式的最大好处是什么事情都能做。包括设置EXCEL的格式,增加删除Sheet,读写单元格,等等。功能几乎是最全的,而且使用起来也不是特别的难。其基本方法都是使用导出的.h文件进行OLE操作,但是由于OLE的接口说明文档不多,想非常完美的使用她们也不是太容易,好在例子也很多。网上普遍认为OLE速度慢,EXCEL的OLE读写方式也基本一
2、样。但是读取速度可以改进,如果在读取的加载整个Sheet的Range的全部数据,而不是一个个单元格读取,那么速度还是相对不错。想想原理也很简单,整体读取减少了OLE的交互次数。OLE的写入方式一般只能几个进行比较方便,所以速度可能要快很多。我自己的亲身体会是,一个EXCEL文件,100多列的字段,如果采用一个个单元格的读取方式,1s大约3条左右的记录,如果整体读取,速度可以提高几十倍。OLE读写EXCEL方式功能很强大,读取速度还可以,但写入速度不高,当然这个方式不可能移植的,而且你必须安装了EXCEL。2.Basic EXCEL 方式这是CodeProject上的一个推荐开源工程了,http
3、:/ EXCEL呢。他不支持很多东西,公式,文件格式,表格合并等(有人说中文支持也不好),所以可以认为他只支持最基本的EXCEL表格,我自己的尝试是如果这个EXCEL文件有其他元素(公式,格式等),使用Basic EXCEL读取会失败。OLE读写EXCEL方式功能比较弱,由于是直接根据文件格式操作,读写速度都不错,你也不需要按照EXCEL,另外这个方式是可以移植的,但是有一些成本,其代码比较晦涩难懂,而且没有注释,另外即使在Windows平台上,告警也很多。3.Sourceforge 上的几个EXCEL库。Sourceforge 上有几个开源的的EXCEL库,但是完善的不多,有的是为了PHP读
4、写EXCEL准备的,包括libXLS,XLSlib,SmartEXCEL等。我下载了几个实验了一下,在Widonws都没有编译成功。也罢了。4.ODBC的方式这个亲身没有尝试过,但是按照原理,应该只能读写。速度吗,ODBC的速度本来就是出名的慢了。http:/ LibXL 是一个收费的EXCEL的库。http:/ /sSql = LINSERT INTO Grade (序号,射杀方,被射杀方,时间) VALUES ( + mStr0 + L, + mStr1 +L, + mStr2 +L, + mStr3 +L); mStr0为字符串类型/关闭数据库database.Close();CATCH
5、_ALL(e)TRACE1(Excel驱动没有安装:%s,sDriver);END_CATCH_ALL;3.通过ODBC直接读取Excel文件(暂定文件名:Demo.xls)/读取Excel文件voidCRWExcel:ReadFromExcel()CDatabasedatabase;CStringsSql;CStringsItem1,sItem2;CStringsDriver;CStringsDsn;CStringsFile=Demo.xls;/将被读取的Excel文件名/检索是否安装有Excel驱动MicrosoftExcelDriver(*.xls)sDriver=GetExcelDri
6、ver();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);CRecordsetrecset(&database);/设置读取的查询语句.注意此处表名的写法,excel里的表默认为系统表,所以访问表时表明应为表明$sSql=SELECTName,AgeFROMdemoOR
7、DERBYName;/执行查询语句recset.Open(CRecordset:forwardOnly,sSql,CRecordset:readOnly);/获取查询结果while(!recset.IsEOF()/读取Excel内部数值recset.GetFieldValue(Name,sItem1);recset.GetFieldValue(Age,sItem2);/移到下一行recset.MoveNext();/关闭数据库database.Close();CATCH(CDBException,e)/数据库操作产生异常时.AfxMessageBox(数据库错误:+e-m_strError);END_CATCH; 4. 获取ODBC中Excel驱动函数CStringCRWExcel:GetExcelDriver()charszBuf2001;WORDcbBufMax=2000;WORDcbBufOut;char*pszBuf=szBuf;CStringsDriver;/获取已安装驱动的名称(涵数在odbcinst.h里)if(!SQLGetInstalledDrivers(szBuf,cbBufMax,&cbBufOut)return;