vs2005 + ADO 获取Excel2007中的所有sheet名称有关问题
vs2005 + ADO 获取Excel2007中的所有sheet名称问题
问题描述:使用vs2005创建的win32工程,使用ADO操作Excel文件,现在需要读取一个Excel中所有的sheet的名称以及每个sheet中的字段名(将第一行作为列名)。现在的问题是如果Excel文件是打开的状态(双击打开的意思),那么一切似乎都没有什么问题,如果没有打开,则总是会多读取一些sheet名称出来,而且这些名称的特征是:某个sheet后接"FilterDatabase"。还有个别sheet名称前后带有单引号(害得我取到名称后还加了去掉前后单引号处理),实际是没有的。
下边贴上相关代码:
搞了一上午了,想换成COM来搞,发现win32控制台不好导入那些类,还是硬着头皮用ADO吧。请大家帮忙指点。
------解决思路----------------------
if(TheValue.vt!=VT_NULL)
m_List.AddString((char*)_bstr_t(TheValue));
std::string strTable = (_bstr_t)(pRst->GetFields()->GetItem("TABLE_NAME")->Value);
改为
_variant_t TheValue;
std::string strTable;
TheValue=pRst->GetFields()->GetItem("TABLE_NAME")->Value;
if(TheValue.vt!=VT_NULL) {
strTable=(_bstr_t)TheValue;
} else {
strTable="NULL";
}
试试看?
------解决思路----------------------
只能自己过滤,可能有一些excel的隐藏sheet也会取出来
------解决思路----------------------
没办法的话就自己取到后加个判断好了,比如末尾是'$'的才保存下来。
问题描述:使用vs2005创建的win32工程,使用ADO操作Excel文件,现在需要读取一个Excel中所有的sheet的名称以及每个sheet中的字段名(将第一行作为列名)。现在的问题是如果Excel文件是打开的状态(双击打开的意思),那么一切似乎都没有什么问题,如果没有打开,则总是会多读取一些sheet名称出来,而且这些名称的特征是:某个sheet后接"FilterDatabase"。还有个别sheet名称前后带有单引号(害得我取到名称后还加了去掉前后单引号处理),实际是没有的。
下边贴上相关代码:
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
std::string szConnString("Provider=Microsoft.ACE.OLEDB.12.0;Persist Security Info=False;Data Source="+szExcelPath+";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"");
pConn->ConnectionString = szConnString.c_str(); // 访问excel 2007字符串
try
{
pConn->Open("","","",adModeUnknown);
}
catch(_com_error e)
{
printf("pConn->Open失败%s\n",(char*)(e.Description()));
return false;
}
pRst = pConn->OpenSchema(adSchemaTables);
while(!pRst->adoEOF)
{
std::string strTable = (_bstr_t)(pRst->GetFields()->GetItem("TABLE_NAME")->Value);
if (strTable.at(0) == '\'')
{
strTable = strTable.substr(1);
}
if (strTable.at(strTable.length()-1) == '\'')
{
strTable = strTable.substr(0,strTable.length()-1);
}
printf("%s\n", strTable.c_str());
pRst->MoveNext();
}
pRst->Close();
搞了一上午了,想换成COM来搞,发现win32控制台不好导入那些类,还是硬着头皮用ADO吧。请大家帮忙指点。
------解决思路----------------------
if(TheValue.vt!=VT_NULL)
m_List.AddString((char*)_bstr_t(TheValue));
std::string strTable = (_bstr_t)(pRst->GetFields()->GetItem("TABLE_NAME")->Value);
改为
_variant_t TheValue;
std::string strTable;
TheValue=pRst->GetFields()->GetItem("TABLE_NAME")->Value;
if(TheValue.vt!=VT_NULL) {
strTable=(_bstr_t)TheValue;
} else {
strTable="NULL";
}
试试看?
------解决思路----------------------
只能自己过滤,可能有一些excel的隐藏sheet也会取出来
------解决思路----------------------
没办法的话就自己取到后加个判断好了,比如末尾是'$'的才保存下来。