MFC通过sql访问excel的方法
1.首先检查安装的驱动中是否有excel,代码如下:
CString CAbcd1Dlg::GetExcelDriver()
{
TCHAR sBuf[1000], *p=sBuf;
WORD sBufMax=1000, sBufOut;
if (!SQLGetInstalledDrivers(sBuf, sBufMax, &sBufOut))
return "";
CString strDriver;
do{
if(_tcsstr(p,_T("Excel"))!=0)
{
strDriver=CString(p);
break;
}
p=_tcschr(p,_T('\0') )+1;
}while(p[1]!=_T('\0'));
return strDriver;
}
此函数的返回值即为excel驱动设备名称
2.读取访问excel表数据,先定义一个表,操作如下:
运行Microsoft Excel , 打开要操作的工作簿, 左键拖拽,选取要定义成为表的区域,
从菜单中选择'插入 '->'名称'->'定义','定义名称'对话框出现后,键入表的名字,
例如:test,保存退出。
这样,你就可以在VC中,使用象SELECT * FROM test这样的SQL语句了
CString sD;
//m_strDriver为 1 中获取的excel设备驱动名称,
//strExcelFullFileName是excel表的全名
sD.Format(_T("ODBC;DRIVER={%s};DSN='';DBQ=%s"), m_strDriver, strExcelFullFileName);
CDatabase database;
//打开数据库(即Excel文件)
if (0 == database.Open(NULL, false, false, sD))
{
CString strFailInfo;
strFailInfo.Format(_T("%s database 打开失败"),strExcelName);
AfxMessageBox(strFailInfo);
return;
}
CRecordset recset(&database);
//设置读取的查询语句
CString ql(_T("SELECT 字段1,字段2 FROM test"));
//执行查询语句
recset.Open(CRecordset::forwardOnly,ql,CRecordset::readOnly);
遍历每一条,获取每一个字段
while(!recset.IsEOF())
{
CString str1, str2;
recset.GetFieldValue(_T("字段1"), str1);
recset.GetFieldValue(_T("字段2"), str2);
recset.MoveNext();//移到下一条记录
}
3.写excel
CString sSql;
//m_strDriver为 1 中获取的excel设备驱动名称
//strExcelFileName 为 写入的excel名称
sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",m_strDriver, strExcelFileName, strExcelFileName);
//打开数据文件
if (0 == m_dbWriteToExcel.OpenEx(sSql,CDatabase::noOdbcDialog)){
return false;
}
写入表头
sSql = "CREATE TABLE Exceldemo (字段1 TEXT, 字段2 TEXT)";
m_dbWriteToExcel.ExecuteSQL(sSql);
//写入数据
str1.Replace(_T("'"),_T("''"));
str2.Replace(_T("'"),_T("''"));
CString strSql;
strSql.Format(_T("INSERT INTO Exceldemo (字段1, 字段2) VALUES ('%s', '%s ')"),str1, str2);
m_dbWriteToExcel.ExecuteSQL(strSql);
备注:
1.由于sql中插入的字段值要用''包起来,如果字段值中有'则会出现冲突,在sql中俩个'代表一个'
2.'%s ' 后面的'号前有个空格,经过测试,'紧挨着%s会出现一些奇怪的情况。