1. 程式人生 > >終於完成了ADO對Excel的逐行讀取

終於完成了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();