EXCEL表的MFC导入
非网络环境的数据库应用程序,一般在更改环境时,都需要进行数据源的重置。但相比之下,针对文件数据库的数据源配置在应用程序没有写动态配置数据源的方法时,需要手动配置数据源。程序才能访问数据库文件。相比access数据库的.mdb数据库文件,EXCEL表具有操作便捷,兼容性好等优点。下面介绍在MFC中导入excel数据表的方法。
导入excel数据表的思路是通过动态注册excel表数据源至odbc,程序通过odbc数据源访问数据表。这个过程可以大致描述3步:
1:获取odbc数据管理器excel驱动程序
2:获取当前数据库文件当前目录
3:注册数据源
根据模块化思想,下面提供访问examp.xls表的方法:
example.xls有四列
第一行分别为:
函数1:获取odbc数据管理器excel驱动程序
CString GetExcelDriver() { char sBuf[2048], excel[]="xls",*p = sBuf; WORD sBufMax = 1000, sBufOut; CString eDriver(_T("")); if (!SQLGetInstalledDrivers(sBuf, sBufMax, &sBufOut)) return _T(""); do { if (strstr(p, excel) !=0) { eDriver = CString(p); break; } p = strchr(p , '\0') +1; } while (p[1] != '\0'); return eDriver; }
以上是在MFC中导入excel数据表的大致方法。函数1 函数2可以通过在MFC类中通过添加成员函数的方法加入类中,函数3一般直接写进需要处理数据表的消息处理函数中。函数2:获取当前数据库文件当前目录
CString GetFileName() { CStringcPath,m_csFile; GetModuleFileName(NULL, cPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); cPath.ReleaseBuffer(); int os; os = cPath.ReverseFind('\\'); cPath = cPath.Left(os-6); m_csFile.Format(_T("%s\\examp.xls"),(const wchar_t *)cPath.GetBuffer(cPath.GetLength()));//examp.xls为所需打开的文件名 //examp.xls为希望导入的数据表 return m_csFile; }
函数3:注册数据源 注意此处需要加头文件
#include <odbcinst.h> #include <afxdb.h> void InintExcel() { CDatabase database; CString m_csDriver= GetExcelDriver(); CString m_csFile=GetFileName(); GetModuleFileName(NULL, cPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); cPath.ReleaseBuffer(); m_csSD.Format(_T("ODBC;DRIVER={%s};DSN='';DBQ=%s"), (const wchar_t *)m_csDriver.GetBuffer(m_csDriver.GetLength()), (const wchar_t*)m_csFile.GetBuffer(m_csFile.GetLength())); int n= database.Open(NULL, false, false, m_csSD); if (0 == n) { AfxMessageBox("Open file failed!"); return false; } CRecordset recset(&database); ql.Format("SELECT ITEM1,ITEM2,ITEM3,ITEM4 FROM list"); if(!recset.Open(CRecordset::forwardOnly, ql, CRecordset::readOnly)) { AfxMessageBox("Open database failed!"); return false; } while(!recset.IsEOF()) { recset.GetFieldValue("ITEM1",item[0]); recset.GetFieldValue("ITEM2", item[1]); recset.GetFieldValue("ITEM3", item[2]); recset.GetFieldValue("ITEM4", item[3]); //如果读取到的值是空值,则停止读取,表明后续都是空的 if(item[0].CompareNoCase("") == 0) { break; } } }