首先,我們要明白的是,VC是通過(guò)ODBC來(lái)訪問(wèn)Excel表格的,也就是說(shuō),VC將Excel表格,當(dāng)作數(shù)據(jù)庫(kù)來(lái)處理。當(dāng)然了,也可以通過(guò)讀以tab鍵隔開(kāi)的文件來(lái)處理這樣的文件,但是,我還是更加愿意用讀取數(shù)據(jù)庫(kù)的方式來(lái)訪問(wèn)Excel表格。
第二,既然是數(shù)據(jù)庫(kù),那么,就需要建立一個(gè)與該庫(kù)對(duì)應(yīng)的dsn,這個(gè),而且,在建立dsn之前,首先要確定,已經(jīng)安裝了Excel的驅(qū)動(dòng)。
第三,要訪問(wèn)數(shù)據(jù)庫(kù)中的表格,就要先打開(kāi)該表格,如此,就需要一個(gè)與之對(duì)應(yīng)的RecordSet。如此,有如下代碼:
void CRWExcel::ReadFromExcel()
{
CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver;
CString sDsn;
CString sFile = "Demo.xls";// 將被讀取的Excel文件名
// 檢索是否安裝有Excel驅(qū)動(dòng) "Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
// 沒(méi)有發(fā)現(xiàn)Excel驅(qū)動(dòng)
AfxMessageBox("沒(méi)有安裝Excel驅(qū)動(dòng)!");
return;
}
// 創(chuàng)建進(jìn)行存取的字符串
sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);
TRY
{
// 打開(kāi)數(shù)據(jù)庫(kù),建立與這個(gè)Excel對(duì)應(yīng)的Database
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
// 設(shè)置讀取的查詢語(yǔ)句.demo.xls并非文件名,需要在excel中進(jìn)行//設(shè)置,具體文章最后有講
sSql = "SELECT Age, Name FROM DEMO.XLS";
// 執(zhí)行查詢語(yǔ)句,打開(kāi)表格
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
// 獲取查詢結(jié)果
while (!recset.IsEOF())
{
//讀取Excel內(nèi)部數(shù)值
recset.GetFieldValue("Name ", sItem1);
recset.GetFieldValue("Age", sItem2);
// 移到下一行
recset.MoveNext();
}
// 關(guān)閉數(shù)據(jù)庫(kù)
database.Close();
}
CATCH(CDBException, e)
{
// 數(shù)據(jù)庫(kù)操作產(chǎn)生異常時(shí)...
AfxMessageBox("數(shù)據(jù)庫(kù)錯(cuò)誤: " + e->m_strError);
}
END_CATCH;
}
需要注意的是,我們對(duì)我們的Excel表格需要進(jìn)行一些處理,需要先選定我們要讀取的數(shù)據(jù),之后,選擇插入>>名字>>之后,在輸入框中輸入我們?cè)趕elect語(yǔ)句中用到的表名。第二,需要設(shè)置列名,為我們選定部分的最前面的一行的數(shù)據(jù)。