用ODBC读Excel

GPoint 2011-07-08 05:00:49
CString strTable;
strTable=_T("综合录井表");
sSql.Format("select * from [%s$]",strTable);

// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);


如代码,在连接Excel数据文件后,必须要知道Excel文件的表名“综合录井表”才可以产生产生记录集。有没有简单的方法,动态的获取Excel的工作表名。我看网上有人问过这样的问题,没有回答的。那位大侠帮帮忙。我是用ODBC读的,不要再推介我用其它方法读了。
...全文
248 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
for_onxx 2012-12-18
  • 打赏
  • 举报
回复
引用 19 楼 zhong_yong_fei 的回复:
引用 18 楼 zy_master 的回复:楼主的问题解决了吗?想知道答案 最后只能换方法了,似乎odbc确实没办法获得worksheet名。如果一个Excel中有多个sheet,用ODBC读起来更麻烦。
是你自己不会用,人家Tr0j4n已经写得非常清楚了。
GPoint 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zy_master 的回复:]
楼主的问题解决了吗?想知道答案
[/Quote]
最后只能换方法了,似乎odbc确实没办法获得worksheet名。如果一个Excel中有多个sheet,用ODBC读起来更麻烦。
zy_master 2011-12-19
  • 打赏
  • 举报
回复
楼主的问题解决了吗?想知道答案
GPoint 2011-07-14
  • 打赏
  • 举报
回复
谁还能给出点别的建议,我有了比较复杂的方法实现了功能,但觉得速度慢了很多。谁还能给点建议。
MoXiaoRab 2011-07-12
  • 打赏
  • 举报
回复
怎么会不行,你excel通过odbc进行连接后,本身就会被看成数据库。
GPoint 2011-07-12
  • 打赏
  • 举报
回复
再等一天,没有答复就结贴了。我现在是用OLe获得表名,然后用odbc读取表中的数据。现在只能这样凑合的用了。这样就是运行速度慢了很多。先这样凑合着吧
GPoint 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tr0j4n 的回复:]
odbc遍历求数据库中表名:

C/C++ code

bool CDBInfoDlg::ListTables(bool bViews, bool bSystemTables)
{
CDatabase database;
CString type = " 'TABLE ' ";
int ret= -1;
HSTMT ……
[/Quote]
数据库表名遍历和Excel文件的表名遍历不一样啊。我试了半天不行
GPoint 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 tr0j4n 的回复:]
怎么会不行,你excel通过odbc进行连接后,本身就会被看成数据库。
[/Quote]
我按你的方法试过了,确实读不出来。你试验过吗?
我的Excel文件里面只有一个worksheet, sheet1一直读不出来。要不你给我写一个可以读出来的的代码。我再加20分,
见习学术士 2011-07-11
  • 打赏
  • 举报
回复
好像是Connect的OpenSchema这个方法
MoXiaoRab 2011-07-11
  • 打赏
  • 举报
回复
odbc遍历求数据库中表名:
bool   CDBInfoDlg::ListTables(bool   bViews,   bool   bSystemTables) 
{
CDatabase database;
CString type = " 'TABLE ' ";
int ret= -1;
HSTMT hStmt;
UCHAR szName[256];
SDWORD cbName;
CString names;

if( bViews )
type += ", 'VIEW ' ";//视图

if( bSystemTables )
type += ", 'SYSTEM TABLE ' ";//系统表

try{
if( !database.Open(m_strDSN) )
return false;
}
catch(...){
AfxMessageBox( "Unable To Obtain Table Information ");
return false;
}

SQLAllocStmt(database.m_hdbc,&hStmt);
ret = SQLTables(hStmt,
NULL,SQL_NTS,
NULL,SQL_NTS,
NULL,SQL_NTS,
(unsigned char *)type.GetBuffer(0),SQL_NTS);

if(ret == SQL_ERROR){
SQLFreeStmt(hStmt,SQL_CLOSE);
database.Close();
if(ret == SQL_INVALID_HANDLE ){
AfxMessageBox( "Invalid handle ");
return false;
}
AfxMessageBox( "Database Could Not be Open ");
return false;
}


m_cmbTables.ResetContent();

while(1){

ret = SQLFetch(hStmt);
if(ret == SQL_NO_DATA_FOUND)
break;
ret = SQLGetData(hStmt, 3, SQL_C_CHAR, szName, TABLE_NAME_LENGTH, &cbName);

names.Format( "%s ",szName);
m_cmbTables.AddString(names);
}

m_cmbTables.SetCurSel(0);

SQLFreeStmt(hStmt,SQL_CLOSE);
database.Close();

ShowTable();

return true;
}


ado


void   CdbToolsDlg::GetDatabaseSchema(_ConnectionPtr   pConnection,   _bstr_t*   bstrTableNames,   int*   nTableCount,   _bstr_t   bstrFilter) 
{
ASSERT(pConnection-> State==adStateOpen);
_RecordsetPtr pRstSchema = NULL;

SAFEARRAY FAR* psa = NULL;
SAFEARRAYBOUND rgsabound;
_variant_t var;
_variant_t Array;
rgsabound.lLbound = 0;
rgsabound.cElements = 4;
psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
var.vt = VT_EMPTY;
long ix;
ix = 0;
SafeArrayPutElement(psa, &ix, &var);

ix= 1;
SafeArrayPutElement(psa, &ix, &var);

ix = 2;
SafeArrayPutElement(psa, &ix, &var);

var.vt = VT_BSTR;
//表的类型有 "ALIAS " "TABLE " "SYNONYM " "SYSTEM TABLE "
"VIEW " "GLOBAL TEMPORARY " "LOCAL TEMPORARY " "SYSTEM VIEW "
var.bstrVal = bstrFilter;//这里bstrFilter= "TABLE "就可以了

ix = 3;
SafeArrayPutElement(psa, &ix, &var);

var.vt=VT_EMPTY;
Array.vt = VT_ARRAY|VT_VARIANT;
Array.parray = psa;

try
{
pRstSchema = pConnection-> OpenSchema(adSchemaTables,&Array);

*nTableCount=0;
while(!(pRstSchema-> EndOfFile))
{
if(bstrTableNames!=NULL)
{
_bstr_t table_name = pRstSchema-> Fields->
GetItem( "TABLE_NAME ")-> Value;
*(bstrTableNames++)=table_name;
}
*nTableCount+=1;
pRstSchema-> MoveNext();
}
}
catch (_com_error e) {
PrintComError(e);
}

if(pRstSchema)
if (pRstSchema-> State == adStateOpen)
pRstSchema-> Close();
}
MoXiaoRab 2011-07-11
  • 打赏
  • 举报
回复
OpenSchema adSchemaTables
GPoint 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shenyi0106 的回复:]
引用 4 楼 zhong_yong_fei 的回复:
引用 3 楼 shenyi0106 的回复:
驱动是否正确?
http://topic.csdn.net/t/20021012/14/1090480.html

我装的是office 2003 驱动获取没有问题。关键是这个worksheet名现在没办法动态获取。必须手工输入worksheet名,

这个应该是的哟,就和ACCESS……
[/Quote]没学过Access数据库,学过一点SQL。在ACCESS里面应该如何查询表名。
直接给我个可以通用的获取表名的代码也行。
解决了直接给分。
向立天 2011-07-11
  • 打赏
  • 举报
回复
不要用数据库的方式操作excel
用com接口
http://wenku.baidu.com/view/563e90c7aa00b52acfc7caf4.html
shenyi0106 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhong_yong_fei 的回复:]
引用 3 楼 shenyi0106 的回复:
驱动是否正确?
http://topic.csdn.net/t/20021012/14/1090480.html

我装的是office 2003 驱动获取没有问题。关键是这个worksheet名现在没办法动态获取。必须手工输入worksheet名,
[/Quote]
这个应该是的哟,就和ACCESS数据库中的表名称一样啊
GPoint 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q1q2q3q4ln 的回复:]
ODBC来获取,不清楚,
但是直接用OFFICE API是可以动态获得SHEET名的,你看看头文件
[/Quote]
能具体点吗?没看懂你说的意思。
GPoint 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q1q2q3q4ln 的回复:]
ODBC来获取,不清楚,
但是直接用OFFICE API是可以动态获得SHEET名的,你看看头文件
[/Quote]

在msdn上查询OFFICE API吗?
使用哪个函数?
GPoint 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shenyi0106 的回复:]
驱动是否正确?
http://topic.csdn.net/t/20021012/14/1090480.html
[/Quote]
我装的是office 2003 驱动获取没有问题。关键是这个worksheet名现在没办法动态获取。必须手工输入worksheet名,
shenyi0106 2011-07-11
  • 打赏
  • 举报
回复
q1q2q3q4ln 2011-07-11
  • 打赏
  • 举报
回复
ODBC来获取,不清楚,
但是直接用OFFICE API是可以动态获得SHEET名的,你看看头文件
GPoint 2011-07-09
  • 打赏
  • 举报
回复
那位大侠帮帮忙,如果我的问题没说清楚。我可以补充,在线等

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧