资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C+读取Excel的XLS文件的方法有很多,但是也许就是因为方法太多,大家在选择的时候会很疑惑。由于前两天要做导表工具,比较了常用的方法,总结一下写个短文,1. OLE的方式这个大约是最常用的方式,这个方式其实启动了一个EXCEL的进程在背后读写EXCEL文件,这个方式的最大好处是什么事情都能做。包括设置EXCEL的格式,增加删除Sheet,读写单元格,等等。功能几乎是最全的,而且使用起来也不是特别的难。其基本方法都是使用导出的.h文件进行OLE操作,但是由于OLE的接口说明文档不多,想非常完美的使用她们也不是太容易,好在例子也很多。网上普遍认为OLE速度慢,EXCEL的OLE读写方式也基本一样。但是读取速度可以改进,如果在读取的加载整个Sheet的Range的全部数据,而不是一个个单元格读取,那么速度还是相对不错。想想原理也很简单,整体读取减少了OLE的交互次数。OLE的写入方式一般只能几个进行比较方便,所以速度可能要快很多。我自己的亲身体会是,一个EXCEL文件,100多列的字段,如果采用一个个单元格的读取方式,1s大约3条左右的记录,如果整体读取,速度可以提高几十倍。OLE读写EXCEL方式功能很强大,读取速度还可以,但写入速度不高,当然这个方式不可能移植的,而且你必须安装了EXCEL。2.Basic EXCEL 方式这是CodeProject上的一个推荐开源工程了,http:/www.codeproject.com/KB/office/BasicExcel.aspx作者是基于EXCEL的文件格式进行的处理。但是为什么叫Basic EXCEL呢。他不支持很多东西,公式,文件格式,表格合并等(有人说中文支持也不好),所以可以认为他只支持最基本的EXCEL表格,我自己的尝试是如果这个EXCEL文件有其他元素(公式,格式等),使用Basic EXCEL读取会失败。OLE读写EXCEL方式功能比较弱,由于是直接根据文件格式操作,读写速度都不错,你也不需要按照EXCEL,另外这个方式是可以移植的,但是有一些成本,其代码比较晦涩难懂,而且没有注释,另外即使在Windows平台上,告警也很多。3.Sourceforge 上的几个EXCEL库。Sourceforge 上有几个开源的的EXCEL库,但是完善的不多,有的是为了PHP读写EXCEL准备的,包括libXLS,XLSlib,SmartEXCEL等。我下载了几个实验了一下,在Widonws都没有编译成功。也罢了。4.ODBC的方式这个亲身没有尝试过,但是按照原理,应该只能读写。速度吗,ODBC的速度本来就是出名的慢了。http:/www.vckbase.com/document/viewdoc/?id=4215.ADO的方式ADO的方式听说应该就是使用OLEDB的方式。和OLE的方式应该没有本质区别。我看了看例子也和OLE很像6.LibXL LibXL 是一个收费的EXCEL的库。http:/www.libxl.com/按照他的说明,他可以不依赖EXCEL读取XLS文件。包括设置格式等。看例子操作应该很简单。但是是否可以移植到Linux平台,我估计难度也不小。呵呵。由于要收费,没有法子测试了。7.网上一些号称不用OLE读取EXCEL例子初步看了一下,这个应该是网上探索EXCEL格式文档的例子。可以实际操作的方式不强。一、直接通过ODBC读、写Excel表格文件首先,我们要明白的是,VC是通过ODBC来访问Excel表格的,也就是说,VC将Excel表格,当作数据库来处理。当然了,也可以通过读以tab键隔开的文件来处理这样的文件,但是,我还是更加愿意用读取数据库的方式来访问Excel表格。第二,既然是数据库,那么,就需要建立一个与该库对应的dsn,这个,而且,在建立dsn之前,首先要确定,已经安装了Excel的驱动。第三,要访问数据库中的表格,就要先打开该表格,如此,就需要一个与之对应的RecordSet想要通过ODBC直接读、写Excel表格文件,首先,应确保ODBC中已安装有Excel表格文件的驱动MICROSOFTEXCELDRIVER(*.XLS)。然后,可根据下面步骤进行:1.在StdAfx.h文件中加入:#include#include2.通过ODBC直接创建Excel文件(暂定文件名:Demo.xls)/创建并写入Excel文件voidCRWExcel:WriteToExcel()CDatabasedatabase;CStringsDriver=MICROSOFTEXCELDRIVER(*.XLS);/Excel安装驱动CStringsExcelFile=c:demo.xls;/要建立的Excel文件CStringsSql;TRY/创建进行存取的字符串sSql.Format(DRIVER=%s;DSN=;FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=%s;DBQ=%s,sDriver,sExcelFile,sExcelFile);/创建数据库(既Excel表格文件)if(database.OpenEx(sSql,CDatabase:noOdbcDialog)/创建表结构(姓名、年龄)sSql=CREATETABLEdemo(NameTEXT,AgeNUMBER);database.ExecuteSQL(sSql);/插入数值sSql=INSERTINTOdemo(Name,Age)VALUES(徐景周,26);database.ExecuteSQL(sSql);sSql=INSERTINTOdemo(Name,Age)VALUES(徐志慧,22);database.ExecuteSQL(sSql);sSql=INSERTINTOdemo(Name,Age)VALUES(郭徽,27);database.ExecuteSQL(sSql); /sSql = LINSERT INTO Grade (序号,射杀方,被射杀方,时间) VALUES ( + mStr0 + L, + mStr1 +L, + mStr2 +L, + mStr3 +L); mStr0为字符串类型/关闭数据库database.Close();CATCH_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=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);CRecordsetrecset(&database);/设置读取的查询语句.注意此处表名的写法,excel里的表默认为系统表,所以访问表时表明应为表明$sSql=SELECTName,AgeFROMdemoORDERBYName;/执行查询语句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;
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号