如何通过ODBC访问excel文件

来源:互联网 发布:网络用语zl是什么意思 编辑:程序博客网 时间:2024/05/01 11:51
通过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;  
  }