VC用ODBC方式读取Excel数据

来源:互联网 发布:徐州有mac专柜吗 编辑:程序博客网 时间:2024/06/06 23:13

    CDatabase database;
    CString sSql;
    CString sItem1, sItem2 , sItem3;
    CString sDriver;
    CString sDsn;
    CString sFile,sPath;

   CDBVariant   varValue;
                                    
 //获取主程序所在路径,存在sPath中
 GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
 sPath.ReleaseBuffer();
 int nPos;
 nPos=sPath.ReverseFind ('//');
 sPath=sPath.Left (nPos);
 sFile = sPath + "file://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);
        // 设置读取的查询语句.注意此处表名的写法,excel里的表默认为系统表所以访问表时表名应为[表名$]
        sSql = "SELECT 考生编号,考生姓名,来源 "      
               "FROM [student2$] "                
               "ORDER BY 考生编号 ";
   
        // 执行查询语句
        recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
        // 获取查询结果
        while (!recset.IsEOF())
        {
            //读取Excel内部数值
            recset.GetFieldValue("考生编号", sItem1);
            recset.GetFieldValue("考生姓名", sItem2);
            recset.GetFieldValue("来源", sItem3);
   //显示记取的内容
          m_ExcelList.AddString( sItem1 + " --> "+sItem2 );
            // 移到下一行
            recset.MoveNext();
        }
        // 关闭数据库
        database.Close();
                            
    }
    CATCH(CDBException, e)
    {
        // 数据库操作产生异常时...
        AfxMessageBox("数据库错误: " + e->m_strError);
    }
    END_CATCH;
}

 

 

注意问题:

  1、如excel表中某列既有数字又有字母等数据类型不一致时,读入为某一类型(如CString类型)时,会出一些异常情况,要先判断读入是什么类型,再进行处理。如:

 CDBVariant   varValue;

 recset.GetFieldValue("天线方向",varValue); 
         
   switch(varValue.m_dwType)
   {
   case DBVT_DOUBLE:
    direction.Format("%.5f",varValue.m_dblVal);      
    break;
   case DBVT_LONG:
    direction.Format("%ld",varValue.m_lVal);      
    break;
   case DBVT_STRING:
                direction = varValue.m_pstring->GetBuffer(6);
    break;
   }


CDBVariant类成员

数据成员

m_dwType  包含当前存储值的数据类型。DWORD型 
m_boolVal  包含一个BOOL型值 
m_chVal  包含一个unsigned char型值 
m_iVal  包含一个short型值 
m_lVal  包含一个long型值 
m_fltVal  包含一个float型值 
m_dblVal  包含一个double型值 
m_pdate  包含指向TIMESTAMP_STRUCT型对象的指针 
m_pstring  包含一个CString型值 
m_pbinary  包含一个CLongBinary型值 

 


CDBVariant::m_dwType

说明:
这个数据成员包含用于当前在CDBVariant对象的联合数据成员中存储的值的数据类型。访问这个联合之前必须检查m_dwType的值,以确定要访问哪个联合数据成员。下表列出m_dwType的可能值和相应的联合数据成员。 m_dwType  联合数据成员 
DBVT_NULL  没有联合成员对访问有效 
DBVT_BOOL  m_boolVal 
DBVT_UCHAR  m_chVal 
DBVT_SHORT  m_iVal 
DBVT_LONG  m_lVal 
DBVT_SINGLE  m_fltVal 
DBVT_DOUBLE  m_dblVal 
DBVT_DATE  m_pdate 
DBVT_STRING  m_pstring 
DBVT_BINARY  m_pbinary 

 

2、字段有空格时,用中括号括起来

   sSql = "SELECT LAC,CI,[CELL ID],基站名,MSC,BSC,LAC,CI,BSIC, BCCH,TCH信道数,天线方向,天线高度,天线下倾,longitude,latitude,基站地址,frequency FROM [Exceldemo$] " ;            

原创粉丝点击