【Qt开发笔记】Qt使用ODBC方式读取Excel文件

1.概述

在Qt编程中,读取Excel文件的方式有好几种,这里介绍使用Qt的sql数据库模块在Windows下使用ODBC(ODBC百科概述)的方式读取Excel内容。

使用Qt通过数据库的方式连接至ODBC,并以读取数据库的方式获取Excel文件内容。

这种读取Excel的方式读取简单,易于理解,可用于Excel文件的读取或其它基础操作。

2.思路

可以将一个Excel文件看作是一个DB数据库,文件中的每一页看作是该数据库中的一张表,每一张表中的第一行是数据库表字段,其他的都是数据。

3.驱动下载

Qt通过ODBC连接去读取Excel,需要ODBC支持Excel的读写,即需要"20XX Office System驱动程序:数据连接组件"的支持。下载安装即可。

4.代码Demo

这里写了一个readAll函数,即按行读取Excel表格内容,输入fileName文件名、tableName表名(例如:Sheet1),输出类型为QList类型的allData,其中的每一个元素QStringList为一行数据以QString类型读出并组成一个列表。

函数声明

/**
 * @brief readAll              [brief]  按行读取Excel某张表中的所有内容
 * @param fileName             [input]  Excel文件路径
 * @param tableName            [input]  表名(例如Sheet1)
 * @param allData              [output] 读出的数据
 * @return                     [return] 成功or失败
 */
bool readAll(const QString &fileName, const QString &tableName, QList<QStringList> &allData)

因为这里要用到Qt Sql数据库的操作,pro工程文件中添加QT += sql,以及相应的头文件包含,这里就不作过多赘述了。

函数实现

bool readAll(const QString &fileName, const QString &tableName, QList<QStringList> &allData)
{
    
    
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "excelexport");
    if (!db.isValid()) {
    
    
        qDebug() << "database is not valid!";
        return false;
    }
    QString dsn = QString("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Readonly=TRUE;DBQ=%1;").arg(fileName);
    db.setDatabaseName(dsn);

    if (!db.open()) {
    
    
        qDebug() << "database open failed !";
        qDebug() << db.lastError().text();
        return false;
    }
    QSqlQuery query(db);
    query.exec(QString("select * from [%1$]").arg(tableName));
    while (query.next()) {
    
    
        QStringList rowData;
        for (int i = 0; i < EXCEL_TABLE_COLUMN; i++) {
    
    
            rowData << query.value(i).toString();
        }
        allData << rowData;
    }
    query.clear();
    db.close();

    return true;
}

5.注意事项

当在计算Excel中一张表的行数时,表为空,计算出的行数count = 0;当仅有一行内容时,计算出的行数count = 1,;当有多行数据时,第一行的内容将作为表头,也就是数据库中的字段行来处理,即实际该Excel表中的行数等于程序读取出来的有效行数+1。

猜你喜欢

转载自blog.csdn.net/qq_37354286/article/details/84262684
今日推荐