ADO 方式访问 Excel 文件的问题

原地址:http://blog.csdn.net/fox000002/article/details/8033225

 

最近需要利用 ADO 的方式访问 Excel,其间遇到的问题很多,且把问题和解决方法列在这里。

 

1 发现在连接时报 Provider cannot be found 错误

 

结果采用 x64 进行编译可以正确执行,才领悟到原来没有安装 32 位的相关驱动啊。

 

2 import msado15.dll 的位置问题

 

X64 平台下分成32位和64位两个版本。

 

64位: 

 

[cpp] view plaincopyprint?

  1. #import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace \  
  2.     rename("EOF""adoEOF") rename("BOF""adoBOF")  


32位:

 

 

[cpp] view plaincopyprint?

  1. #import "C:\Program Files (x86)\Common Files\System\ADO\msado15.dll" no_namespace \  
  2.     rename("EOF""adoEOF") rename("BOF""adoBOF")  

 

 

 

 

 

3 XLS 和 XLSX 新旧版本文件需要不同的连接字符串

 

XLS 对应的连接字符串:

 

[cpp] view plaincopyprint?

  1. connStr.Format("Provider='Microsoft.JET.OLEDB.4.0';Data Source=%s;Extended Properties=\"Excel 8.0;HDR=%s\"", filename, hdr);  

 

 

 

 

 

XLS 对应的连接字符串则为:

 

[cpp] view plaincopyprint?

  1. connStr.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Extended Properties=\"Excel 12.0 Xml;HDR=%s\"", filename, hdr);   

 

 

 

 

4 X64 模式的情况下,读取某条纪录的某列时需要传递LONG参数

 

最开始的代码:

 

 

[cpp] view plaincopyprint?

  1. CString str;  
  2. str.Format("%d", pRec->Fields->GetCount());  
  3. MessageBox(NULL, str, "Info", MB_OK);  
  4.   
  5. for (int j=0; j<pRec->Fields->GetCount(); ++j)  
  6. {  
  7.     _variant_t v = pRec->Fields->GetItem(j)->Value;  
  8.     MessageBox(NULL, (char*)(_bstr_t)v.bstrVal, "Info", MB_OK);  
  9. }  


结果列数正常,但就是报找不到列的错误,很是无奈。折腾了很久,知道后来改成如下的代码才通过。

 

 

 

[cpp] view plaincopyprint?

  1. for(long i = 0; i < pRec->Fields->GetCount(); ++i)  
  2. {  
  3.     _variant_t v = pRec->Fields->GetItem(i)->Value;  
  4. }  

 

[cpp] view plaincopyprint?

  1. _variant_t vv = pRec->Fields->GetItem(1L)->Value;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值