这种方法的好处是以数据库的方式读取文件而不需要打开EXCEL文件,节省资源
第一步:在stdafx.h中添加头文件
#include
#include
第二步:测试Excel驱动是否安装,
CString
CHomisProView::GetExcelDriver()
{
char szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut;
char *pszBuf = szBuf;
CString sDriver;
//
获取已安装驱动的名称(涵数在odbcinst.h里)
if
(!SQLGetInstalledDrivers(szBuf, cbBufMax,
&cbBufOut))
return "";
// 检索已安装的驱动是否有Excel...
do
{
if (strstr(pszBuf, "Excel") != 0)
{
//发现 !
sDriver =
CString(pszBuf);
break;
}
pszBuf = strchr(pszBuf,'\0')+1;
}
while (pszBuf[1] !=
'\0');
return sDriver;
}
第三步:建立连接,打开文件
CString sFile =
"C:\\默认参数读取.xls"; // 将被读取的Excel文件名
sDriver =
GetExcelDriver();
if (sDriver.IsEmpty())
{
//
没有发现Excel驱动
AfxMessageBox("没有安装Excel驱动!");
return;
}
// 创建进行存取的字符串
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",
sDriver, sFile);
// 打开数据库(既Excel文件)
database.Open(NULL, false, false,
sDsn);
CRecordset
recset(&database);//绑定数据文件
sSql.Format("SELECT * from
[%s$]
",stringName);//$符号表示文件中限定的某个表文件
// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql,
CRecordset::readOnly);
//读取Excel内部数值
recset.GetFieldValue("序号",strContents);
第四步:关闭记录集和数据集
recset.Close();//关闭记录集,因为循环的时候下次还要打开
//
关闭数据库
database.Close();
今天遇到了个问题,在本人机子上编译调试好的程序竟然在别的机子上运行不了,提示Miscrosoft Jet数据库找不到Dbase数据表对象,明明数据表已经存在了,难道是ODBC程序的问题,于是在网上寻找许久,终于找到了解决方法。
问题的根本原因是:dbf遵循早期的8.3文件名格式,对于文件名超过8个字符(注意,是八个字符)的文件读取不正常。
解决方法:
1. 重新命名文件名,使其少于8个字符
2. MDAC 2.1 (or greater) requires the Borland Database Engine (BDE)
to update dBase DBF files. 所以可以选择安装BDE
3. 不再使用通常的Microsoft dBase
Driver (*.dbf) ODBC驱动,换用 Microsoft FoxPro
VFP Driver(*.dbf)ODBC驱动
前两种,经测试成功,后一种本想测试下,才发现没安装相应的VFP驱动,所以就暂时没测试。