【Qt】Qt使用QAxObject批量读写Excel

Qt自带的QAxObject可以通过COM组件的方式操控微软的Offfice组件,包括Word、Excel、PowerPoint。

使用Qt读写Excel数据的场景较多。

前提:

1. Qt项目中的Pro文件中必须加上下面一行,才能使用 QAxObject 库。

qt += axcontainer

2. 运行后面的代码可能需要包含以下头文件,按需添加。

#include <QAxObject>
#include <QAxWidget>
#include <QtDebug>

0. 关键代码

批量读取:

QAxObject *range = worksheet->querySubObject("Range(QString)", "B13:C1000");

批量写:

//QList<QVariant> mLstData;  自己组装好的数据
//QString strMergeCell 是自己组装好的字符串,如  E1:E1000
AxObject *merge_range = worksheet->querySubObject("Range(const QString&)", strMergeCell);
merge_range->setProperty("Value", QVariant(mLstData));

1. 文件打开和关闭及基本单元格读写

(这种调用方式感觉像是在模拟执行Excel软件的菜单栏命令,微软的COM组件也是挺奇葩的,满满的VB味道)

// QString filepath 是文件路径

//后台启动Excel组件
QAxObject *myexcel = new QAxObject("Excel.Application");
myexcel->dynamicCall("SetVisible(bool)", false);
myexcel->setProperty("Visible", false);

//打开文件
QAxObject *workbooks = myexcel->querySubObject("WorkBooks");
workbooks ->dynamicCall("Open(const QString&", filePath);

//打开第一个工作表
QAxObject *workbook = myexcel->querySubObject("ActiveWorkBook");    //工作簿
QAxObject *worksheet = workbook ->querySubObject("Sheets(int)",1);

//读取A6格的数据
QAxObject *cell = worksheet ->querySubObject("Range(QVariant,QVariant)", "A6");
QString centerkm = cell->dynamicCall("Value2()").toString();

//往A6格写入数据 yourData
cell ->setProperty("Value", QVariant(yourData));

//保存文件,strFileName是保存文件路径
workbook ->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(strFileName));

//关闭工作簿
workbook ->dynamicCall("Close()");
//释放所有工作表
worksheet ->clear();
//退出Excel
myexcel ->dynamicCall("Quit()");
//释放excel指针
delete myexcel ;

2. 批量读写

2.1 读取单列或者单行

下面两种写法效果相同。

QString col= "B4:B5";

// 可以自己拼接,如
// QString col = "B4:B";
// col.append(QString::number(99));
// col 就是 B4:B99

QAxObject *myColAx= worksheet->querySubObject("Range(QString)", col);
QVariant colData = cell->dynamicCall("Value2()");
QVariantList colDataList = colData.toList();    //先转成List


//qDebug()<<colDataList.count();

//遍历List
for(int i=0; i<= colDataList.count() - 1; i++)
{
    QVariantList rowData =  colDataList[i].toList() ;
    qDebug()<< rowData[0].toString();
}

2.2 批量读取多列多行

QString Range = "B1:C12";    //12行2列

QAxObject *rangeAx = sheet->querySubObject("Range(QString)", Range);
QVariant rangeData = rangeAx ->dynamicCall("Value2()");
QVariantList rangeDataList = rangeData.toList();    //先转成List


//qDebug() << rangeDataList.count();

//遍历List
for(int i=0; i<= rangeDataList.count() - 1; i++)
{
    QVariantList rowData =  rangeDataList[i].toList() ;
    qDebug()<< rowData[0].toString();    //打印第i行第0列,即列B
    qDebug()<< rowData[1].toString();    //打印第i行第1列,即列C
}

注意:B1:C12这种范围读取的写法返回的结果是个嵌套List的List。QList<QList<>>这种。

直接打印 colData  返回如下。其中11,12是 B4 B5单元格的值。

QVariant(QVariantList, (QVariant(QVariantList, (QVariant(QString, "11"))), QVariant(QVariantList, (QVariant(QString, "12")))))

2.3 批量写和批量读类似

批量写未测试,仅供参考。

QList<QVariant> data;

QList<QString> strList;
strList << "sdfsd" << "asdfjoasdf";

data << strList;

QAxObject *rangeAx = worksheet->querySubObject("Range(const QString&)", "B1:C12");
rangeAx ->setProperty("Value", QVariant(data));

3. 读取整个Excel

QAxObject *usedRange = worksheet->querySubObject("UsedRange"); 
QVariant cell = usedRange->dynamicCall("Value");

4. 自动判断读取行数

很多时候,需要代码自己判断指定的数据区域,比如从第一行开始读取,直到最后一行。如何判断最后一行呢?

//获取该sheet的使用范围对象
QAxObject * usedrange = worksheet->querySubObject("UsedRange");

QAxObject * rows = usedrange->querySubObject("Rows");
QAxObject * columns = usedrange->querySubObject("Columns");

int intRows = rows->property("Count").toInt();
int intCols = columns->property("Count").toInt();

qDebug() << "xls行数:"<<intRows;
qDebug() << "xls列数:"<<intCols;

博主注:如果是解析机器生成的Excel文件,那么此方法适用。如果是人手工制作的Excel文件,可能存在有些行列无内容但是也被设置或使用后,被代码判定为有效行。如果你的代码需要十分严谨,建议自己编写判断行列是否有效的代码。

5. 参考

Qt使用QAxObject快速批量读取Excel内容_Sandeepin技术博客-CSDN博客_qaxobject读取excel网上各种教程用的方法主要是如下这一句:QAxObject * range = worksheet->querySubObject("Cells(int,int)", 1, 1 );  这种方法当然也行,可以一项一项地读,但是当读取数量很大的时候就很慢了,在我的电脑上测试读5000个数据大约168s左右。看资料找到一种批量读取的方法,经测试读10000行的数据才3s多,效果超级棒,充分发挥了QAhttps://blog.csdn.net/sandeepin/article/details/71246494

Qt批量操作Excel_lance710825的专栏-CSDN博客最近在做一个项目,客户要求把查询到的数据导出Excel,而网上大部分资料描述的都很局限、很简单。由于要导出的数据量很大(QTableView中大约有几十万条数据),一开始我是找到一个单元格就写入一个值,但这样的话程序就会把大量的时间花费在线程切换中,导致效率太低(5000行数据大概需要5分钟)。最后找到了一种方法,即为对Excel进行批量写入值操作,下面是我程序中导出excel部分的源码:https://blog.csdn.net/lance710825/article/details/46863065

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qilei2010

送我一张彩票中了平分

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值