C/C++知识点之C++通过ADO读写Excel文件
小标 2018-12-26 来源 : 阅读 1764 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C++通过ADO读写Excel文件,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C++通过ADO读写Excel文件,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

介绍

有时候我们需要从excel表格里导入、导出数据。其中一种方式就是通过ADO的方式。在这里,excel文件被当作数据库来处理,该方式不需要客户端安装Microsoft Excel,速度也够快。

连接字符串

这里有两种类型的连接字符串,第一种是针对xls格式的:

Provider=Microsoft.JET.OLEDB.4.0;Data Source=data.xls;Extended Properties="Excel 8.0"

第二种是针对xlsx格式的:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=data.xlsx;Extended Properties="Excel 12.0 Xml"

TESTHR定义

inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); };

写入

首先创建一个连接字符串:

TESTHR(pCon.CreateInstance(__uuidof(Connection)));TESTHR(pCon->Open(connStr, "", "", NULL));

然后创建Command对象和表,注意表名就是excel的页:

TESTHR(pCmd.CreateInstance(__uuidof(Command)));pCmd->ActiveConnection = pCon;       pCmd->CommandText = "CREATE TABLE MySheet
   (A int, B varchar, C int, D int, E int, F int, G int, H int, I int, J varchar)";  
pCmd->Execute(NULL, NULL, adCmdText);

创建Recordset并增加记录:

TESTHR(pRec.CreateInstance(__uuidof(Recordset)));
pRec->Open("SELECT * FROM MySheet", _variant_t((IDispatch*)pCon),
   adOpenKeyset, adLockOptimistic, adCmdText);for(int i = 0; i < writeRows; ++i)
{
   TESTHR(pRec->AddNew());

   char str[11] = {0}; for(int j = 0; j < 10; ++j) str[j] = 'a' + (rand() % 26);

   pRec->Fields->GetItem("A")->Value = _variant_t(i);            
   pRec->Fields->GetItem("B")->Value = _variant_t(str);            
   pRec->Fields->GetItem("C")->Value = _variant_t(i);
   pRec->Fields->GetItem("D")->Value = _variant_t(i);
   pRec->Fields->GetItem("E")->Value = _variant_t(i);
   pRec->Fields->GetItem("F")->Value = _variant_t(i);
   pRec->Fields->GetItem("G")->Value = _variant_t(i);
   pRec->Fields->GetItem("H")->Value = _variant_t(i);
   pRec->Fields->GetItem("I")->Value = _variant_t(i);
   pRec->Fields->GetItem("J")->Value = _variant_t(str);            
}
TESTHR(pRec->Update());
TESTHR(pRec->Close());

读取

创建和打开Recordset:

TESTHR(pRec.CreateInstance(__uuidof(Recordset)));      
TESTHR(pRec->Open("SELECT * FROM [Sheet1$]", connStr,
   adOpenStatic, adLockOptimistic, adCmdText));

如果excel的页不清楚,可以通过索引来查找:

TESTHR(pCon.CreateInstance(__uuidof(Connection)));
TESTHR(pCon->Open(connStr, "", "", NULL));
   
pSchema = pCon->OpenSchema(adSchemaTables);      

for(int i = 0; i < sheetIndex; ++i) pSchema->MoveNext();

std::string sheetName =
   (char*)(_bstr_t)pSchema->Fields->GetItem("TABLE_NAME")->Value.bstrVal;

读取单元格的值:

while(!pRec->adoEOF)
{    for(long i = 0; i < pRec->Fields->GetCount(); ++i)
   {        if(i > 0) stream << ";";                    
       _variant_t v = pRec->Fields->GetItem(i)->Value;        if(v.vt == VT_R8)                                          
           stream << v.dblVal;        if(v.vt == VT_BSTR)
           stream << (char*)(_bstr_t)v.bstrVal;                                
   }                                    
   stream << std::endl;
   pRec->MoveNext();
}

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved