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會出現一些奇怪的情況。