終於完成了ADO對Excel的逐行讀取
1.首先建立win32控制檯程式
2.在StdAfx.h的合適位置加上
#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
我是加在
#include <afxwin.h> //- MFC core and standard components
#include <afxext.h> //- MFC extensions
這兩行的下面,不然會產生莫名的錯誤,我沒搞懂
3.下面就是主程式了:
// 初始化COM,建立ADO連線
CoInitialize(NULL);
_ConnectionPtr m_pConnection=NULL;
m_pConnection.CreateInstance(__uuidof(Connection));
//獲得Excel檔名和路徑
CString ExcelName;
CFileDialog MyDlg(TRUE, NULL,_T("xls"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Worksheet Files (*.xls)|*.xls"), NULL);
if (MyDlg.DoModal()==IDOK)
{ ExcelName=MyDlg.GetFileName();}
try
{
// 開啟指定的Excel檔案
//m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.xls;Extended Properties=/"Excel 8.0;HDR=No;IMEX=1/"","","",adModeUnknown);
_bstr_t strConn;
CString strconnect="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
strconnect+=ExcelName;
strconnect+=";Extended Properties=/"Excel 8.0;HDR=No;IMEX=1/"";
strConn= (_bstr_t)strconnect;
m_pConnection->Open(strConn,"","",adModeUnknown);
}
catch(_com_error e)
{
MessageBox(NULL,_T("資料庫連線失敗,確認資料庫Excel是否在當前路徑下! "),_T("資料庫連線錯誤"),MB_OK);
// return FALSE;
}
// 使用ADO建立資料庫記錄集
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
//AfxMessageBox(L "Debug1 ");
m_pRecordset-> Open( "SELECT * FROM [Sheet1$] ", // 查詢Sheet1表中所有欄位
m_pConnection.GetInterfacePtr(), // 獲取庫接庫的IDispatch指標
adOpenDynamic,
adLockOptimistic,
adCmdText);
//AfxMessageBox(L "Debug2 ");
}
catch(_com_error e)
{
MessageBox(NULL,_T("錯誤"),_T("錯誤"),MB_ICONWARNING);
// return FALSE;
}
//讀取表內資料
_variant_t var;
CString sDianMing,sBianMa,sX,sY,sH;
try
{
if(!m_pRecordset->adoBOF)
m_pRecordset->MoveFirst();
else
{
MessageBox(NULL,_T("表內資料為空"),_T("提示"),MB_OK);
//return FALSE;
}
// 讀入庫中各欄位
while(!m_pRecordset->adoEOF)
{
i++;
var = m_pRecordset->GetCollect(_T("F1"));
if(var.vt != VT_NULL)
sDianMing = (LPCSTR)_bstr_t(var);
wcsncpy(DianMing,sDianMing.GetBuffer(),100);
sDianMing.ReleaseBuffer();
var = m_pRecordset->GetCollect(_T("F2"));
if(var.vt != VT_NULL)
sBianMa = (LPCSTR)_bstr_t(var);
wcsncpy(BianMa,sBianMa.GetBuffer(),100);
sBianMa.ReleaseBuffer();
var = m_pRecordset->GetCollect(_T("F3"));
if(var.vt != VT_NULL)
sX = (LPCSTR)_bstr_t(var);
_tempchar = sX.GetBuffer();
sX.ReleaseBuffer();
X=_tstof(_tempchar);
var = m_pRecordset->GetCollect(_T("F4"));
if(var.vt != VT_NULL)
sY = (LPCSTR)_bstr_t(var);
_tempchar = sY.GetBuffer();
sY.ReleaseBuffer();
Y=_tstof(_tempchar);
var = m_pRecordset->GetCollect(_T("F5"));
if(var.vt != VT_NULL)
sH = (LPCSTR)_bstr_t(var);
_tempchar = sH.GetBuffer();
sH.ReleaseBuffer();
H=_tstof(_tempchar);
//對讀出的資料做點什麼。。。我讀的是Excel中只有五列數:點名,編碼,x,y,h,用於展點的
4.關閉記錄集和資料庫連線
m_pRecordset-> Close();
m_pConnection->Close();