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。