QT之ODBC操作Excel的解决方案

来源:互联网 发布:杭州网店美工培训 编辑:程序博客网 时间:2024/05/16 06:21

      公司的一个测试程序,需要导出一些数据到Excel中。最初想到的是利用AxObject来实现,但好像对于我来说并没有找到什么好的解决方案,于是换成了ODBC操作Excel的方案。这是有原因的,因为当初QT使用SQL Server数据库的时候,我选择的就是利用ODBC实现的,相对来说比较熟悉。

      QT的版本为:QT 5.3.1

      开发环境:windows7 64位


 第一步、使用到ODBC自然要添加sql库了。在.pro文件中添加:

QT += sql

第二步、增加相应的头文件

#include <QFileDialog>#include <QSqlDatabase>#include <QSqlQuery>#include <QDate>#include <QSqlError>


第三步、实现代码:

//导出文件void FrameMain::on_btn_exportAddr_clicked(){    QString filename = QFileDialog::getSaveFileName(this,                                                    tr("Save Excel"),                                                    "MacAddr",                                                    tr("*.xls;; *.xlsx")); //选择路径    if(filename.isEmpty()){        return;    }else{               qDebug() << "filename:" << filename;        QString sheetName = "Sheet1";        QSqlDatabase db = QSqlDatabase::addDatabase("QODBC","excelexport");        if( !db.isValid())            return;   //! type error        QString dsn = "DRIVER={Microsoft Excel Driver (*.xls)};"                "DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=";        dsn += ("\"" + filename + ".xls\"" + ";DBQ=" + filename + ".xls");        qDebug() << "dsb:" << dsn;        db.setDatabaseName( dsn);        // open connection        if( !db.open())            return;  //! db error        QSqlQuery query(db);        QString sSql;        bool state;        // drop the table if it's already exists        sSql = QString("DROP TABLE [%1]").arg(sheetName);        query.exec( sSql);        //create the table (sheet in Excel file)        sSql = QString("CREATE TABLE [%1] (").arg(sheetName);        sSql += "[ADDR] char(20), [DAY] char(50)";        sSql += ")";        state = query.prepare( sSql);        if( !query.exec()) {            printError( query.lastError());            goto CLOSE; //! create failed        }        for (int i = 0; i < excelSave->length(); i ++){            sSql = QString("INSERT INTO [%1] ").arg( sheetName);            sSql += "(ADDR, DAY) VALUES(:addr,:day)";            state = query.prepare( sSql);            qDebug() << excelSave->at(i)->addr << " " << excelSave->at(i)->data;            query.bindValue(":addr", excelSave->at(i)->addr);            query.bindValue(":day", excelSave->at(i)->data);            if( !query.exec()) {                printError( query.lastError());                goto CLOSE; //! insert failed            }        }        //close connectionCLOSE:        db.close();    }}
      现在来看一下上面这个代码,很明显,这是一个槽函数,响应一个按钮的槽函数。首先,调用QFileDialog,得到需要保存Excel文件的路径和文件名,保存在filename当中。然后,再定义一些ODBC需要使用的变量,比如sheetName和dsn,sheetName是Excel界面的分页项,而dsn这是非常重要的,中文翻译过来就是数据源名称。

      DSN为ODBC定义了一个确定的数据库和必须用到的ODBC驱动程序。每个ODBC驱动程序定义为该驱动程序支持的一个数据库创建DSN需要的信息。就是说安装ODBC驱动程序以及创建一个数据库之后,必须创建一个DSN。

      最后,就是完成操作数据库相似的操作了,同样用到SQL语句。先创建了表格,然后再往表格上插入数据,具体步骤可以参考代码。

      下图是跳出的FileDialog:

      下图是保存之后的Excel:



2 0
原创粉丝点击