VC通过ADO访问Excell

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查询语句来找到自己感兴趣的记录。3、从Excel中读数据.读数据比较简单,可以使用SQL查询语句来找到自己感兴趣的记录。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,读数据比较简单,可以使用SQL查询语句来找到自己感兴趣的记录。

_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());
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值