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。