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会出现一些奇怪的情况。