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; } } }