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。