• 10034阅读
  • 9回复

怎样用ODBC连EXCEL获取所有的表名? [复制链接]

上一主题 下一主题
离线a761208
 
只看楼主 倒序阅读 楼主  发表于: 2010-05-25
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
RT:怎样用ODBC连EXCEL获取所有的表名?
离线XChinux

只看该作者 1楼 发表于: 2010-05-25
和使用ODBC连接ACCESS、MSSQL的方法相似。构造DSN字符串,可以运行odbcad32.exe自己配置一下文件DSN看看字符串内容是如何写的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线a761208
只看该作者 2楼 发表于: 2010-05-25
谢谢你
但是我的重点在如何获取表名上
离线a761208
只看该作者 3楼 发表于: 2010-05-25
有没有人知道?
离线a761208
只看该作者 4楼 发表于: 2010-05-25
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "EXCEL");
QString connStr = "Driver={Microsoft Excel Driver (*.xls)};Dbq=" + filename;
db.setDatabaseName(connStr);
if (db.open()) {
    QStringList tables = db.tables();
    QMessageBox::information(NULL, "", QString::number(tables.length()));
}

=================
结果是 0
离线a761208
只看该作者 5楼 发表于: 2010-05-25
========================================================
表格内容:

========================================================
代码:
  1. QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "EXCEL");
  2. QString connStr = "Driver={Microsoft Excel Driver (*.xls)};Dbq=" + filename;
  3. db.setDatabaseName(connStr);
  4. if (!db.open()) {
  5.     QMessageBox::critical(this, tr("ERROR"), tr(
  6.             "Can not open excel file:\n%1").arg(db.lastError().text()));
  7.     return;
  8. }
  9. QSqlQuery query(db);
  10. query.exec("SELECT * from [sheet1$]");
  11. int i = 0;
  12. while (query.next()) {
  13.     QString a = query.value(0).toString();
  14.     QString b = query.value(1).toString();
  15.     QString c = query.value(2).toString();
  16.     QString d = query.value(3).toString();
  17.     QMessageBox::information(NULL, "", a);
  18.     QMessageBox::information(NULL, "", b);
  19.     QMessageBox::information(NULL, "", c);
  20.     QMessageBox::information(NULL, "", d);
  21.     if (i++ >= 10) {
  22.         break;
  23.     }
  24. }
  25. db.close();


结果没有第一行的内容了
第一个Messagebox就是a2
这是什么原因?
离线a761208
只看该作者 6楼 发表于: 2010-05-25
上面的问题知道原因了
参考
http://support.microsoft.com/kb/288343/zh-cn
Excel ODBC会一直认为第一行是列名
这是个BUG
推荐使用Jet驱动
离线a761208
只看该作者 7楼 发表于: 2010-05-25
关于第一行的问题可以用下面的代码解决:
  1. QSqlRecord header = query.record();
  2. for (int i = 0, j = header.count(); i < j; i++) {
  3.     QMessageBox::information(NULL, "", header.fieldName(i));
  4. }
离线a761208
只看该作者 8楼 发表于: 2010-06-03
关于第一行又出现新的问题:
当第一行里面有数字的时候,列名不是原来的数字了,而是变成F1、F2...



离线a761208
只看该作者 9楼 发表于: 2010-06-03
现在已经放弃ODBC读EXCEL了
改成PHP转XML然后读XML了
快速回复
限100 字节
 
上一个 下一个