哪位仁兄知道,在VC2005中,使用ODBC读取Excel数据时,如果没有表头,怎样直接读取Excel数据的方法?
谢谢!

解决方案 »

  1.   

    用ADO吧,置顶的帖子里有,Excel数据库连接字符串
    "HDR=Yes;" indicates that the first row contains columnnames, not data. "HDR=No;" indicates the opposite.
      

  2.   

    置顶的帖子里都是介绍怎样操作Access的,没有关于Excel的,请指教
      

  3.   

    连接字符串换成Excel就行了,其他差不多。
      

  4.   

    我只学过odbc,而且还学得不怎么样,希望高手指点一下……
      

  5.   

    只是连接字符串不同而已,区别不大。 tmp.Format(TEXT("Driver={Microsoft Excel Driver (*.xls)};Dbq=%s;ReadOnly=1;"), resToken); try
    {
    db.OpenEx(tmp, CDatabase::openReadOnly);
    if (db.IsOpen())
    {
    lb->InsertString(-1, TEXT(""));
    tmp.Format(TEXT("打开Excel文件: %s 成功!准备转换数据...."), resToken);
    lb->InsertString(-1, tmp);
    lb->SetCurSel(lb->GetCount()-1);
    rs.Open(-1, TEXT("select * from [sheet1$]"));
    }
    }catch(CDBException &e)
    {
    e.ReportError();
    }
      

  6.   

    CString ReadExcel:: GetExcelDriver()
    {
    TCHAR szBuf[2001];
    WORD cbBufMax = 2000;
    WORD cbBufOut;
    TCHAR *pszBuf = szBuf;
    CString sDriver;
    // 获取已安装驱动的名称(涵数在odbcinst.h里)//获取系统中已经安装的数据库驱动器信息可以通过SQLGetInstalledDrivers函数来实现。该函数定义如下: 
    //BOOL   SQLGetInstalledDrivers( 
    //                               LPSTR   lpszBuf,   //保存驱动器信息的缓冲区 
    //                               WORD   cbBufMax,   //缓冲区最大长度 
    //                               WORD   *   pcbBufOut   //返回的实际使用的缓冲区长度 
    //                              )if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))   
    return "";
    // 检索已安装的驱动是否有Excel...
    do
    {
       if (_tcsstr(pszBuf, _T("Excel")) != 0)   //char *strstr(char *str1,char *str2);作用是找出str2字符串在str1字符串中第一次出现
                                               //的位置(不包括str2的串结束符),如果找到返回该位置的指针。若找不到,返回NULL指针
          {
           //发现 !
           sDriver = CString(pszBuf);
           break;
          }
        pszBuf = wcschr(pszBuf, _T('\0')) + 1;
    }
    while (pszBuf[1] != '\0');return sDriver;
    }////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////获得excel文件路径
    void ReadExcel::Initial_path( )
    {
        CFileDialog MyDlg(TRUE, NULL,_T("xls"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Worksheet Files (*.xls)|*.xls"), NULL);
    if (MyDlg.DoModal()==IDOK)
    { ExcelName=MyDlg.GetFileName();}}
    //设定sheet名和行名
    void ReadExcel::Initial_sheet_columnname(CString _sheet, CString _columnname)
    {
    SheetName  = _sheet;
    ColumnName = _columnname;
    CString _temp = _columnname;
    ColumnLength = _temp.Remove(',') + 1;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////打开excel文件
    void ReadExcel::Open_DataBase()
    {    
    // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" 
    sDriver = GetExcelDriver();
    if (sDriver.IsEmpty())
    {
    // 没有发现Excel驱动
    AfxMessageBox(_T("没有安装Excel驱动!"));
    return;
    }
    // 创建进行存取的字符串
    sDsn.Format(_T("ODBC;DRIVER={%s};DSN='';DBQ=%s"), sDriver, ExcelName);
    TRY
    {
    // 打开数据库(既Excel文件)
    database.Open(NULL, false, false, sDsn);
    recset = new CRecordset(&database);
    //recset = &database;
    //CRecordset recset(&database);
    // 设置读取的查询语句.
    sSql = _T("SELECT ") + ColumnName + _T(" FROM ") + SheetName;//"ORDER BY Name ";
    // 执行查询语句
    recset->Open(CRecordset::forwardOnly/*dynamic*/, sSql, CRecordset::readOnly);    
    }
    CATCH(CDBException, e)
    {
    // 数据库操作产生异常时...
    AfxMessageBox(_T("数据库错误: ") + e->m_strError);
    }
    END_CATCH;
    }/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //关闭excel文件
    void ReadExcel::Close_DataBae()
    {
    recset->Close();
    // 关闭数据库
    database.Close();
    }///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    还是请教高人,使用ODBC的方法,在上述代码中能做修改不?
      

  7.   

    对Excel而言,真不需要使用ODBC~