QODBC + Excel 解决方案

来源:互联网 发布:淘宝新客户关系营销 编辑:程序博客网 时间:2024/05/16 14:21

通过AxObject的方式不喜欢,百度又比较少其他相关资料,我研究了一下ODBC的方法查EXCEL

当然对于格式化什么的不敢恭维,但是对于我们熟悉的sql等操作还是很亲民的。另外excel作为一个小白都敢动手的文件格式

也是首选,比ini亲切多了。

使用这个请自己添加Qt的SQL库。我在Qt 5.1 - winXP - VS2010 环境下成功运行


2013年9月25日 10:19:39     晴

打开
链接成功。关键地方,链接串:DBQ要路径,至少“.\\”或者完整路径,否则无效
但db.open()返回true。
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=E:\\workspace\\QExcel\\QExcel\\test.xls;DefaultDir=c:\\;");
    if (db.open())
    {
        QSqlQuery query;
        bool flag = query.exec(QStringLiteral("select * from [Sheet2$]"));
        while (query.next()) {
            QString title = query.value(0).toString();
            QString author = query.value(1).toString();
            //QMessageBox::critical(0, title,author);
        }
    }
//查询列名
bool flag = query.exec(QStringLiteral("select 监控对象 from [监控对象编号$]"));
//可写,设置readonly = 0
db.setDatabaseName("Driver={Microsoft Excel Driver (*.xls)};ReadOnly = 0;DriverId=790;Dbq=E:\\workspace\\QExcel\\QExcel\\data.xls;DefaultDir=c:\\;");
 
 
 
 
QODBC+Excel 的插入方法
下面是插入方法,在sql中插入数据的格式是
INSERT INTO 表 [(字段1[,字段2[, ...]])]
VALUES (值1[,值2[, ...])
在这里value指定变量名,再在下面填充变量内容,才可以。
 
当然我们常用的方法是通过组合字符串,也可以使用填充变量
QSqlQuery readPassword("SELECT * FROM password WHERE username=:username");
readPassword.bindValue(":username", ui->lineEdit_2->text());
 
    if (db.open())
    {
        QSqlQuery query;
        bool flag1 = query.prepare(QStringLiteral("insert into [监控对象分类$] ([编号],[分类名称]) values(:_id, :_name)"));
        //绑定方式1
//         query.bindValue(0,QStringLiteral("5"));
//         query.bindValue(1,QStringLiteral("不知道"));
        
        //绑定方式2
        query.bindValue(QStringLiteral(":_id"),QStringLiteral("6"));
         query.bindValue(QStringLiteral(":_name"),QStringLiteral("不晓得"));
        bool succ = query.exec();
        qDebug()<<query.lastError().text();
    }
结果:
 
批量插入数据
        QSqlQuery query;
        query.prepare(QStringLiteral("insert into [监控对象分类$] values(?,?)"));
        QVariantList ints;
        ints << "10" << "11" << "12" << "13";
        query.addBindValue(ints);
        QVariantList names;
        names << QStringLiteral("一定¨") << QStringLiteral("确定¨") << QStringLiteral("肯定") << QVariant(QVariant::String);
        query.addBindValue(names);
        if (!query.execBatch())
            qDebug() << query.lastError();
 
 
QODBCResult::exec: Unable to execute statement: "[Microsoft][ODBC Excel Driver] 该 ISAM 不支持在链接表中删除数据。"
 
    if (db.open())
    {
        QSqlQuery query;
        bool flag = query.prepare(QStringLiteral("DELETE FROM [监控对象分类$] WHERE 分类名称 = :_name"));
 
 
        //绑定方式2
          query.bindValue(QStringLiteral(":_name"),QStringLiteral("安防监控使能"));
 
        bool succ = query.exec();
        qDebug()<<query.lastError().text();
 
    }
 
 
注意,使用内部变量的时候不带[],譬如":_id",不能写成"[:_id]"。
query.prepare(QStringLiteral("UPDATE [监控对象分类$] SET 编号 = :_id WHERE 分类名称 = :_name"));
表格列名可以有"[]"也可以没有。
    if (db.open())
    {
        QSqlQuery query;
        query.prepare(QStringLiteral("UPDATE [监控对象分类$] SET [编号] = :_id WHERE [分类名称] = :_name"));
        query.bindValue(QStringLiteral(":_id"),QStringLiteral("10"));
        query.bindValue(QStringLiteral(":_name"),QStringLiteral("安防监控使能"));
        bool succ = query.exec();
        qDebug()<<query.lastError().text();
    }
 
另外
打开了Excel 可以实时看到表格项目被更改,但是如果程序先运行则不能打开表格,会提示被占用。
如果打开了Excel有时候会提示,无法读取或打开之类,所以文件读写最好不要打开文本。
 
 
相关资料:
Qt社区问题 http://qt-project.org/search/tag/excel
 
Qt数据库操作
2012-6-28 08:48| 发布者: benben| 查看: 3056| 评论: 0
摘要: 原文:http://blog.163.com/lijiji_1515/blog/static/126877446200982911635165/qt-win-commercial-src-4.3.1、qt-x11-commercial-src-4.3.1Microsoft Visual C++ 6.0、KDevelop 3.5.0Windows Xp、Solaris 10、Fedor ...
 
MS Excel 连接串 http://www.connectionstrings.com/excel#microsoft-excel-odbc-driver
 
关于Qt COM和ODBC操作Excel速度的比较  http://yanhubin.blog.163.com/blog/static/43257911201361112140611/