天天看點

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。