//请问在VC中,怎样通过ADO访问excel
//怎样进行链接数据源,怎样链接数据表,怎样遍历记录集,怎样读取字段,怎样写入字段,怎样修改字段等...
//ADO访问excel与ADO访问Access在哪些方面有什么不同。最好有实例,当然也可以引见别人的帖子, 谢谢了[公司的报表都是excel的,最近老是处理这些报表,烦啊] 
另外,请兄弟们别引导我去学习ODBC,DAO以及api等等,我只会一点将ADO封装成类,然后调用它们的这些方法
 
 

解决方案 »

  1.   

    把Excel当做数据库来操作,步骤如下:1、在stdafx.h中加入#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")2、在工程的App类的构造函数中打开要操作的Excel表格 _ConnectionPtr pCon_ex;
     CString ConnectionString;CToolsApp::CToolsApp()
    {
     CString m_strAppPath=_T("");
     CString excel_path=_T("");
     CString con_str=_T("");
     
     //程序所在目录路径
     TCHAR exeFullPath[MAX_PATH];
     GetModuleFileName(NULL,exeFullPath,MAX_PATH);
     
     CString str;
     str.Format("%s",exeFullPath);
     
     m_strAppPath = str.Left( str.ReverseFind( '\\' ) );
     excel_path = m_strAppPath+"\\Database"+"\\新全国图数据统计模版--.xls";
     
     CoInitialize(NULL); //打开excel
     /*"HDR=Yes;" 表示工作表的第一行是表头,没有数据。 "HDR=No;"与之相反。 
    "IMEX=1;"告诉驱动程序始终将"intermixed"数据类型(numbers, dates, strings等等)作为文本型读取。 
    注意:该选项可能引起Excel工作表写权限的修改。如果想写入数据,创建新表等必须使其为0*/
     ConnectionString = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");   
     ConnectionString += excel_path;   //excel   file   name   
     ConnectionString += _T(";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=0\""); 
     
     BSTR resultsString = ConnectionString.AllocSysString();
     pCon_ex.CreateInstance(__uuidof(Connection));
     
     resultsString = ConnectionString.AllocSysString();
     pCon_ex->Open(resultsString,"","",adModeUnknown);
    }3、从Excel中读数据    读数据比较简单,可以使用SQL查询语句来找到自己感兴趣的记录。  CString strSQL=_T("");
      _RecordsetPtr  pRst(__uuidof(Recordset));    //数据集
      _RecordsetPtr  Rs1(__uuidof(Recordset));     //数目集
      
      strSQL="select * from [道路$] where 城市 like '%"+str_city+"%'"; //[道路$]为sheet的名称
      pRst=(((CDataManaApp*)AfxGetApp())->pCon_ex)->Execute((_bstr_t)strSQL,NULL,adCmdText);  //指定的城市  
      
      CString sql=_T(""); 
      sql="select   count(*) as geshu from [道路$] where 城市 like '%"+str_city+"%'";   
      Rs1=(((CDataManaApp*)AfxGetApp())->pCon_ex)->Execute((_bstr_t)sql,NULL,adCmdText);
      _variant_t   vCount=Rs1->GetCollect("geshu");
      int num1=vCount.lVal;   //符合条件的记录个数  pRst->MoveFirst();  //只读取第一行  _variant_t t = _variant_t(long(6));
      result = (LPCSTR)_bstr_t(pRecordset->GetCollect(t));//以列序号的方式来读取字段内容  0based  result = (LPCSTR)_bstr_t(pRecordset->GetCollect("人口"));//以字段名的方式来读字段内容4 增加新行以及填写某个cell  _RecordsetPtr m_pRecordset;
       m_pRecordset.CreateInstance(__uuidof(Recordset));  try
      {
         m_pRecordset->Open("SELECT * FROM [道路$]",// 查询道路表中所有字段
         ((CToolsApp*)AfxGetApp())->pCon_ex.GetInterfacePtr(),  // 获取库接库的IDispatch指针
         adOpenDynamic,
         adLockOptimistic,
         adCmdText);
      }
      catch(_com_error *e)
      {
       AfxMessageBox(e->ErrorMessage());
      }
      
      try
      {
        CString strDate= "123.698";
        //添加新记录
        m_pRecordset->MoveFirst();
        m_pRecordset->Move(15);  //此行没用 无论当前的指针在什么位置,都将插入到最后一行 数据库是不能在中间插入新行的
        m_pRecordset->AddNew(); //如是要更新cell 不要这句
        _variant_t t = _variant_t(long(6));
        m_pRecordset->PutCollect(&t,_variant_t(strDate)); //更新第七个字段 也可以用字段名的指定
        m_pRecordset->Update();    m_pRecordset->Close();
        m_pRecordset = NULL;
       }
      catch(_com_error *e)
      {
       AfxMessageBox(e->ErrorMessage());
      }