Windows Qt5下用QAxObject快速读写Excel指南

Qt Windows 下快速读写Excel指南

很多人搜如何读写excel都会看到用QAxObject来进行操作,很多人试了之后都会发现一个问题,就是慢,非常缓慢!因此很多人得出结论是QAxObject读写excel方法不可取,效率低。 
后来我曾试过用ODBC等数据库类型的接口进行读写,遇到中文嗝屁不说,超大的excel还是会读取速度慢。 
最后,看了一些开源的代码后发现,Windows下读取excel,还是用QAxObject最快!没错,就是用QAxObject读写最快!!!(读取10万单元格229ms) 
大家以后读取excel时(win下),不用考虑别的方法,用QAxObject就行,速度杠杠的,慢是你操作有误!下面就说说如何能提高其读取效率。

读取excel慢的原因

这里不说如何打开或生成excel,着重说说如何快速读取excel。 
网上搜到用Qt操作excel的方法,读取都是使用类似下面这种方法进行:

读取慢的根源就在于sheet->querySubObject("Cells(int, int)", row, col)

试想有10000个单元就得调用10000次querySubObject,网络上90%的教程都没说这个querySubObject产生的QAxObject*最好进行手动删除,虽然在它的父级QAxObject会管理它的内存,但父级不析构,子对象也不会析构,若调用10000次,就会产生10000个QAxObject对象 
得益于QT快速读取数据量很大的Excel文件此文,下面总结如何快速读写excel

快速读取excel文件

原则是一次调用querySubObject把所有数据读取到内存中 
VBA中可以使用UsedRange把所有用到的单元格范围返回,并使用属性Value把这些单元格的所有值获取。

这时,获取到的值是一个table,但Qt把它变为一个变量QVariant来储存,其实实际是一个QList<QList<QVariant> >,此时要操作里面的内容,需要把这个QVariant转换为QList<QList<QVariant> >

先看看获取整个单元格的函数示意(这里ExcelBase是一个读写excel的类封装):

代码中this->sheet是已经打开的一个sheet,再获取内容时使用this->sheet->querySubObject("UsedRange");即可把所有范围都获取。

下面这个castVariant2ListListVariant函数把QVariant转换为QList<QList<QVariant> >

这样excel的所有内容都转换为QList<QList<QVariant>>保存,其中QList<QList<QVariant> >QList<QVariant>为每行的内容,行按顺序放入最外围的QList中。

对于如下如的excel:

下面看看此excel的读取速度有多高 
这里有个excel,有1000行,100列,共计十万单元格,打开使用了一些时间,读取10万单元格耗时229毫秒, 
读取的代码如下:(完整源代码见后面)

上面的m_xls和m_datas是成员变量:

读取的耗时:

10万个也就0.2秒而已

快速写入excel文件

同理,能通过QAxObject *usedRange = this->sheet->querySubObject("UsedRange");实现快速读取,也可以实现快速写入

快速写入前需要些获取写入单元格的范围:Range(const QString&) 
如excel的A1为第一行第一列,那么A1:B2就是从第一行第一列到第二行第二列的范围。

要写入这个范围,同样也是通过一个与之对应的QList<QList<QVariant> >,具体见下面代码:

此函数是把数据从A1开始写

函数中的convertToColName为把列数,转换为excel中用字母表示的列数,这个函数是用递归来实现的:

看看写excel的耗时:

写10万个数据耗时262ms,有木有感觉很快,很强大

结论

  • Qt在windows下读写excel最快速的方法还是使用QAxObject
  • 不要使用类似sheet->querySubObject("Cells(int, int)", row, col);的方式读写excel,这是导致低效的更本原因

源代码

–> 见 github

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python opencv过滤红色

OpenCV简易视频处理框架OpenCV主要色彩空间OpenCV的位操作方法 找出视频中红色物体 import cv2 import numpy as npdef filter_out_black(src_frame):if src_frame is not None:hsv cv2.cvtColor(src_frame, cv2.COLOR_BGR2HSV)lower_red np.array([0, 0, 0])upper_red np.…

#39;boost/iterator/iterator_adaptor.hpp#39; file not found之xcode生成时报错的解决方案

xcode生成rn&#xff08;0.49.3&#xff09;项目的时候出现“boost/iterator/iterator_adaptor.hpp file not found之xcode”报错。 原因&#xff1a; /Users/xxx/.rncache 中 boost_1_63_0.tar.gz&#xff0c; double-conversion-1.1.5.tar.gz&#xff0c; folly-2016.09.26.…

经典面试题SALES TAXES思路分析和源码分享

题目&#xff1a; SALES TAXESBasic sales tax is applicable at a rate of 10% on all goods, except books, food, and medical products that are exempt. Import duty is an additional sales tax 除书籍 食品 药品外其他商品基本税为10%。进口税附加5%&#xff0c;不免税。…

Snipaste在Window运行后遇到提示计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll 错误

故障排除 以下为运行 Snipaste 可能遇到的错误及其解决方案。 Windows 运行后遇到提示计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll 错误 请根据你操作系统的版本&#xff08;32位/64位&#xff09;&#xff0c;下载并安装相应的微软 Visual C 2015 可再发行组件包: 32…

Windows10安装ubuntu18.04双系统教程

Windows10安装ubuntu18.04双系统教程 写在前面&#xff1a;本教程为windows10安装ubuntu18.04&#xff08;64位&#xff09;双系统教程&#xff0c;是我多次安装双系统的经验总结&#xff0c;安装方法同样适用于ubuntu16.04&#xff08;64位&#xff09;。为了直观和易于理解&…

ffmpeg h264+ts +udp传输

http://bbs.csdn.net/topics/370246456 http://1229363.blog.163.com/blog/static/19743427201001244711137/ ffmpeg windows 下编译 http://www.360doc.com/content/13/0913/15/13084517_314201133.shtml h264帧边界识别 http://fs-linux.org/forum.php?modviewthread&ti…

ReactNative实现图集功能

需求描述&#xff1a;  图片缩放、拖动、长按保存等基础图片查看的功能&#xff1b; 展示每张图片文本描述&#xff1b; 实现效果&#xff0c;如图&#xff1a; 实现步骤 使用第三方插件&#xff1a;react-native-image-zoom-viewer 插件GitHub地址&#xff1a;https://git…

C++或C 实现AES ECB模式加密解密,支持官方验证

本文主要介绍 AES 算法的加解密方法。本文使用的语言为 C&#xff0c;调用的 AES 库为&#xff1a;cryptopp。 1 概述 AES 加密算法的介绍如下&#xff08;摘自 WikiPedia&#xff09;&#xff1a; 高级加密标准&#xff08;英语&#xff1a;Advanced Encryption Standard&am…

Kali Linux 2019.4用U盘安装以及解决Kali Linux 2019.4中文乱码问题

一、利用Win32 Disk Imager 实现U盘刻录ISO 1.Kali Linux官网下载 2.Win32 Disk Imager官网下载地址 3.打开Win32 Disk Imager软件&#xff0c;添加下载的镜像文件&#xff0c;选择制作镜像的U盘&#xff0c;点击“”“写入”&#xff0c;等待写入成功完成&#xff01; 二、…

Javascript实现AES加密解密(ECB/CBC)

环境配置 js文件https://code.google.com/archive/p/crypto-js/downloads在线AES加密解密地址在线AES加密解密、AES在线加密解密、AES encryption and decryption--查错网下载完成后在页面中引入 rollups/aes.jscomponents/mode-ecb.jscomponents/pad-nopadding.js引入后页面 …

在PHP中利用wsdl创建标准webservice

参照整理&#xff1a; http://bbs.php100.com/read-htm-tid-95228.htmlhttp://www.ieliwb.com/wsdl-create-soapdiscovery/ 说明&#xff1a; 非标准的webservice&#xff0c;可能只能PHP才能访问 标准的webservice&#xff0c;就必须要使用wsdl在这里我只介绍标准的webserv…

Kali-Linux2019.04设置中文输入法

1.打开超级终端&#xff0c;输入 apt-get install fcitx 首先安装输入法框架 2.输入apt-get install fcitx-googlepinyin 然后安装google输入法 3.如下图&#xff0c;打开fcitx输入法配置 4.通过左下角的“”“”添加&#xff0c;选择刚才安装的google中文输入法&#xff0c…

C语言实现AES加密解密

AES加密是美国联邦政府采用的一种块加密标准&#xff0c;如今已经被全世界广为使用。嵌入式开发中我们也经常会用到加密解密算法&#xff0c;如果没有硬件模块来实现&#xff0c;就需要用到C代码软件实现。下面介绍调用mbedTLS中的AES加密解密函数实现AES算法。 mbedTLS是一个…

react-native绑定优酷SDK-附效果图和源码

ReactNative绑定优酷SDK需要用到两部分知识&#xff1a; 优酷本身的sdk绑定&#xff1b;RN与原生界面的交互&#xff1b; 效果&#xff1a; RN版本&#xff1a;0.49.3 代码更新日期&#xff1a;2017.10.26 下文也根据绑定需要分为两部分&#xff1a; 一、优酷sdk绑定&#…

我的nginx iis 负载均衡学习(环境搭建)

1&#xff0c;下载并安装nginx 比较简单 2&#xff0c;进行网站的配置 我使用了我的IIS 站点中已经拥有的两个站点 3&#xff0c;进行nginx 的配置 配置如下&#xff1a; 在server 节点之前添加如下的配置&#xff1a; upstream www.dalong.com { server 127.0.0.1; …

Kali-Linux-2019.04虚拟机与物理机实现复制粘贴功能

**1.打开虚拟机VM15&#xff0c;启动进入Kali系统&#xff0c;在虚拟机菜单栏&#xff0c;“虚拟机”->安装VMware Tool&#xff0c;弹出框选择“是”。*在Kali系统桌面出现光盘状态的VMware Tool。 1.在超级终端内操作 cd /media/cdrom0 2.复制VMwareTools文件到tmp目录&…

宝塔LNMP使用步骤nginx+php 7.2

安装BT面板 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh 安装LAMP / LNMP 推荐 PHP7.3(最低要求7.0) MySQL5.7(最低要求5.5) PHP 5.6.x即将停止安全支持 面板新建网站 进入面板, 网站, 新建…

react-native多图选择、图片裁剪(支持ad/ios图片个数控制)

前言&#xff1a; 目前关于rn比较知名并且封装好的图片选择控件很多&#xff0c;不过能同时支持多图片上传&#xff0c;个数控制兼容iOS/Ad的却寥寥无几&#xff0c;而今天介绍的这款框架可以实现&#xff1a;图片裁剪、最大图片个数限制、拍照、本地相册等功能。 效果&#x…

QT5主界面“关闭窗口”按钮设置弹出提示询问信息

QT5主界面为“关闭窗体”按钮和其action添加关闭窗口事件&#xff0c;可以询问是否退出 1.在信号与槽函数中&#xff0c;actQuit关联信号与槽函数&#xff0c;如下&#xff1a; 2.在mainwindow.h文件MainWindow类中添加关闭窗口事件closeEvent 3.在mainwindow.cpp文件添加vo…