http://www.cppblog.com/wrhwww/archive/2012/03/02/129421.html#166994
首先,我們要明白的是,VC是通過ODBC來訪問Excel表格的,也就是說,VC將Excel表格,當作資料庫來處理。當然了,也可以通過讀以tab鍵隔開的檔案來處理這樣的檔案,但是,我還是更加願意用讀取資料庫的方式來訪問Excel表格。
第二,既然是資料庫,那麼,就需要建立一個與該庫對應的dsn,這個,而且,在建立dsn之前,首先要確定,已經安裝了Excel的驅動。
第三,要訪問資料庫中的表格,就要先開啟該表格,如此,就需要一個與之對應的RecordSet。如此,有如下代碼:
void CRWExcel::ReadFromExcel()
{
CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver;
CString sDsn;
CString sFile = "Demo.xls";// 將被讀取的Excel檔案名稱
// 檢索是否安裝有Excel驅動 "Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
// 沒有發現Excel驅動
AfxMessageBox("沒有安裝Excel驅動!");
return;
}
// 建立進行存取的字串
sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);
TRY
{
// 開啟資料庫,建立與這個Excel對應的Database
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
// 設定讀取的查詢語句.demo.xls並非檔案名稱,需要在excel中進行//設定,具體文章最後有講
sSql = "SELECT Age, Name FROM DEMO.XLS";
// 執行查詢語句,開啟表格
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
// 擷取查詢結果
while (!recset.IsEOF())
{
//讀取Excel內部數值
recset.GetFieldValue("Name ", sItem1);
recset.GetFieldValue("Age", sItem2);
// 移到下一行
recset.MoveNext();
}
// 關閉資料庫
database.Close();
}
CATCH(CDBException, e)
{
// 資料庫操作產生異常時...
AfxMessageBox("資料庫錯誤: " + e->m_strError);
}
END_CATCH;
}
需要注意的是,我們對我們的Excel表格需要進行一些處理,需要先選定我們要讀取的資料,之後,選擇插入>>名字>>之後,在輸入框中輸入我們在select語句中用到的表名。第二,需要設定列名,為我們選定部分的最前面的一行的資料。