QT学习一:利用QT QAxObject读取Excel表格数据的两种方法比较

目录

QAxObject

QVariant

1.逐单元格读取表格内容

2.一次性读取工作表使用范围



利用QT的 QAxObject读取Excel表格数据的两种方法比较,完整的QT源码到此下载:ReadExcel.rar-嵌入式文档类资源-CSDN下载

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ltcG9ydF9uZXc=,size_16,color_FFFFFF,t_70

QAxObject

如何利用QT进行读取Excel表格呢?这里介绍的是利用QT自带的的QAxObject接口类,普遍有两种方法。

打开QT帮助搜索QAxObject,得知这是一个继承Inherits:QObject and QAxBase的子类。

The QAxObject class provides a QObject that wraps a COM object.
Header:#include <QAxObject> 
qmake:QT += axcontainer
Inherits:QObject and QAxBase


头文件需要包含 #include <QAxObject> ,并且在pro项目文件里面使用QT += core gui axcontainer

打开全部成员列表里面有个

querySubObject(const char *, const QVariant &, const QVariant &, const QVariant &, const QVariant &, const QVariant &, const QVariant &, const QVariant &, const QVariant &) : QAxObject *

我们就是用querySubObject来操作读取Excel表格内容。两种方法导致读取时间上的长短以及代码优异性。

QVariant

还有一个必须要知道的类是QVariant,这是一个数据联合体,用来存放读取到的Excel数据。

The QVariant class acts like a union for the most common Qt data types.
Header:#include <QVariant> 
qmake:QT += core

1.逐单元格读取表格内容

简单来说就是一个单元格调用一次querySubObject,逐行逐列逐个读取。

QAxObject *excel = new QAxObject(this);
for (int i=RowStart; i<RowStart+Row; i++) {
     coecol=0;
     for (int j = ColStart; j < ColStart + Col; j++)
     {
        cell = excel->querySubObject("Cells(Int, Int)", i, j );
     }
 }


相信看了前面概述内容的聪明的网友一眼就看到了问题,querySubObject明明可以一次读取8个var,而现在一次只读取一个单元格内容,简直就是对资源浪费。此种笨拙的方法,建议直接放弃。

这是用第一种方法读取excel数据,用QTableview构建的表格

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ltcG9ydF9uZXc=,size_16,color_FFFFFF,t_70

2.一次性读取工作表使用范围

这个方法直接就是读取工作表用到的内容。d->sheet是打开Excel的一个sheet。读到的内容存放在QVariant里面。

QAxObject *usedRange = d->sheet->querySubObject("UsedRange");
QVariant var = usedRange->dynamicCall("Value");

强烈建议使用这个方法,建议构建一个数据模型 QList<QList<QVariant> >

QList<QList<QVariant> >的原型是QList(const QList<T> &),最外层的QList代表行数组rows,内层的QList代表列数组cols

QList< QList<QVariant> >  datas;//构建数据模型用于存储数据
qDebug()<<datas.size(); //表格的总行数
qDebug()<<datas.at(0).size(); //第一行的列数
for (int a=0;datas.size()>a ;a++ ) 
{
   for (int b=0;datas.at(a).size()>b ;b++ ) 
   {
      qDebug() << QString(datas.at(a).at(b).toByteArray()); //打印所有数据
   }
}

。这是用第二种方法,用QTablewidget构建的表格

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ltcG9ydF9uZXc=,size_16,color_FFFFFF,t_70

 

 

  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt中,可以使用QAxObject类来读取Excel表格中的数据。下面是一个简单的示例代码: ```cpp #include <QAxObject> #include <QDebug> void readExcelData() { QAxObject* excel = new QAxObject("Excel.Application", nullptr); excel->setProperty("Visible", false); QAxObject* workbooks = excel->querySubObject("Workbooks"); QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", "path/to/your/excel/file.xlsx"); QAxObject* sheets = workbook->querySubObject("Worksheets"); QAxObject* sheet = sheets->querySubObject("Item(int)", 1); // 读取第一个工作表 QAxObject* usedRange = sheet->querySubObject("UsedRange"); QAxObject* rows = usedRange->querySubObject("Rows"); QAxObject* columns = usedRange->querySubObject("Columns"); int rowCount = rows->property("Count").toInt(); int columnCount = columns->property("Count").toInt(); for (int row = 1; row <= rowCount; ++row) { for (int column = 1; column <= columnCount; ++column) { QAxObject* cell = sheet->querySubObject("Cells(int,int)", row, column); QVariant value = cell->property("Value"); qDebug() << "Cell(" << row << "," << column << "):" << value.toString(); cell->clear(); delete cell; } } delete rows; delete columns; delete usedRange; delete sheet; delete sheets; workbook->dynamicCall("Close()"); delete workbook; workbooks->dynamicCall("Close()"); delete workbooks; excel->dynamicCall("Quit()"); delete excel; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); readExcelData(); return a.exec(); } ``` 上述代码使用了Qt的ActiveX模块,需要在.pro文件中添加`QT += axcontainer`来启用该模块。在代码中,首先创建了Excel应用程序对象,然后打开指定的Excel文件。接着获取第一个工作表,并通过UsedRange属性获取表格的行数和列数。最后使用Cells方法遍历每个单元格,并读取其值。 请注意,使用QAxObject类需要安装Microsoft Office软件,并且需要在项目的.pro文件中添加`LIBS += -lole32`来链接OLE库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值