天天看點

如何通過ODBC通路excel檔案

通過OBDC,以下是代碼  

  想要通過ODBC直接讀、寫Excel表格檔案,首先,應確定ODBC中已安裝有Excel表格檔案的驅動"MICROSOFT   EXCEL   DRIVER   (*.XLS)"。然後,可根據下面步驟進行:  

  1. 在StdAfx.h檔案中加入:  

  #include   <afxdb.h>    

  #include   <odbcinst.h>  

  2. 通過ODBC直接建立Excel檔案(暫定檔案名:Demo.xls)  

  //建立并寫入Excel檔案  

  void   CRWExcel::WriteToExcel()  

  {  

      CDatabase   database;  

      CString   sDriver   =   "MICROSOFT   EXCEL   DRIVER   (*.XLS)";   //   Excel安裝驅動  

      CString   sExcelFile   =   "c://demo.xls";                                 //   要建立的Excel檔案  

      CString   sSql;  

      TRY  

      {  

          //   建立進行存取的字元串  

          sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/"%s/";DBQ=%s",sDriver,   sExcelFile,   sExcelFile);  

          //   建立資料庫   (既Excel表格檔案)  

          if(   database.OpenEx(sSql,CDatabase::noOdbcDialog)   )  

          {  

              //   建立表結構(姓名、年齡)  

              sSql   =   "CREATE   TABLE   demo   (Name   TEXT,Age   NUMBER)";  

              database.ExecuteSQL(sSql);  

              //   插入數值  

              sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   ('徐景周',26)";  

              database.ExecuteSQL(sSql);  

              sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   ('徐志慧',22)";  

              database.ExecuteSQL(sSql);  

              sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   ('郭徽',27)";  

              database.ExecuteSQL(sSql);  

          }              

          //   關閉資料庫  

          database.Close();  

      }  

      CATCH_ALL(e)  

      {  

          TRACE1("Excel驅動沒有安裝:   %s",sDriver);  

      }  

      END_CATCH_ALL;  

  }  

  3. 通過ODBC直接讀取Excel檔案(暫定檔案名:Demo.xls)  

  //   讀取Excel檔案  

  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.Open(NULL,   false,   false,   sDsn);  

                  CRecordset   recset(&database);  

                  //   設定讀取的查詢語句.  

                  sSql   =   "SELECT   Name,   Age   "                

                                "FROM   demo   "                                    

                                "ORDER   BY   Name   ";  

                  //   執行查詢語句  

                  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;  

  }  

  //   擷取ODBC中Excel驅動  

  CString   CRWExcel::GetExcelDriver()  

  {  

          char   szBuf[2001];  

          WORD   cbBufMax   =   2000;  

          WORD   cbBufOut;  

          char   *pszBuf   =   szBuf;  

          CString   sDriver;  

          //   擷取已安裝驅動的名稱(涵數在odbcinst.h裡)  

          if   (!SQLGetInstalledDrivers(szBuf,   cbBufMax,   &cbBufOut))  

                  return   "";  

          //   檢索已安裝的驅動是否有Excel...  

          do  

          {  

                  if   (strstr(pszBuf,   "Excel")   !=   0)  

                  {  

                          //發現   !  

                          sDriver   =   CString(pszBuf);  

                          break;  

                  }  

                  pszBuf   =   strchr(pszBuf,   '/0')   +   1;  

          }  

          while   (pszBuf[1]   !=   '/0');  

          return   sDriver;  

  }