当前位置: 首页 > news >正文

使用QT操作Excel 表格的常用方法

VBA 简介   

        Microsoft Office软件通常使用VBA来扩展Windows的应用程序功能,Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言。 在VBA的参考手册中就可以看到具体函数、属性的用法,Qt操作Excel主要通过 QAxObject + Excel VBA来实现!关于Qt对Excel的操作,网上的资料挺多的,但大多数都是比较基础的,关于插入工作表(至最后一行)、删除工作表、合并/拆分单元格、设置单元格背景色、设置单元格边框色、设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)、以及设置单元格对齐方式等用法都没有怎么提到,今天就总结一下有关Qt对Excel的操作。Qt操作Excel,无论后缀是xls还是xlsx都可以。下图是Excel VBA参考手册,内容不算太全!

 Excel读取

假设已存在一个excel文件,

主要读取内容:标题,工作表数目,工作表名称,起始行,起始列,行数,列数,单元格内容。

 

QAxObject excel("Excel.Application");  excel.setProperty("Visible", true);  QAxObject *work_books = excel.querySubObject("WorkBooks");  work_books->dynamicCall("Open (const QString&)", QString("E:/test.xlsx"));
QVariant title_value = excel.property("Caption");  //获取标题qDebug()<<QString("excel title : ")<<title_value;  QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可换用WorkSheetsint sheet_count = work_sheets->property("Count").toInt();  //获取工作表数目qDebug()<<QString("sheet count : ")<<sheet_count;  for(int i=1; i<=sheet_count; i++)  {  QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i);  //Sheets(int)也可换用Worksheets(int)QString work_sheet_name = work_sheet->property("Name").toString();  //获取工作表名称
QString message = QString("sheet ")+QString::number(i, 10)+ QString(" name");qDebug()<<message<<work_sheet_name;  }if(sheet_count > 0){
QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);  QAxObject *used_range = work_sheet->querySubObject("UsedRange");  QAxObject *rows = used_range->querySubObject("Rows");  QAxObject *columns = used_range->querySubObject("Columns");  int row_start = used_range->property("Row").toInt();  //获取起始行   int column_start = used_range->property("Column").toInt();  //获取起始列int row_count = rows->property("Count").toInt();  //获取行数int column_count = columns->property("Count").toInt();  //获取列数for(int i=row_start; i{  for(int j=column_start; j{  QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", i, j);  QVariant cell_value = cell->property("Value");  //获取单元格内容QString message = QString("row-")+QString::number(i, 10)+QString("-column-")+QString::number(j, 10)+QString(":");qDebug()<<message<<cell_value;  }  }  }

效果如下:

 

 Excel增、删、改

主要操作:

  • 设置标题
  • 插入工作表(至最后一行)
  • 设置工作表名称
  • 删除工作表
  • 设置单元格内容
  • 设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)
  • 设置单元格对齐方式
  • 设置单元格高度、宽度
  • 设置单元格背景色、边框色
  • 合并/拆分单元格
  • 清空单元格

代码如下:

QAxObject excel("Excel.Application");  excel.setProperty("Visible", true);  QAxObject *work_books = excel.querySubObject("WorkBooks");  work_books->dynamicCall("Open(const QString&)", "E:\\test.xlsx");excel.setProperty("Caption", "Qt Excel");QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可换用WorkSheets//删除工作表(删除第一个)QAxObject *first_sheet = work_sheets->querySubObject("Item(int)", 1);first_sheet->dynamicCall("delete");//插入工作表(插入至最后一行)int sheet_count = work_sheets->property("Count").toInt();  //获取工作表数目QAxObject *last_sheet = work_sheets->querySubObject("Item(int)", sheet_count);QAxObject *work_sheet = work_sheets->querySubObject("Add(QVariant)", last_sheet->asVariant());
last_sheet->dynamicCall("Move(QVariant)", work_sheet->asVariant());work_sheet->setProperty("Name", "Qt Sheet");  //设置工作表名称//操作单元格(第2行第2列)QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2, 2);cell->setProperty("Value", "Java C++ C# PHP Perl Python Delphi Ruby");  //设置单元格值cell->setProperty("RowHeight", 50);  //设置单元格行高cell->setProperty("ColumnWidth", 30);  //设置单元格列宽cell->setProperty("HorizontalAlignment", -4108); //左对齐(xlLeft):-4131  居中(xlCenter):-4108  右对齐(xlRight):-4152cell->setProperty("VerticalAlignment", -4108);  //上对齐(xlTop)-4160 居中(xlCenter):-4108  下对齐(xlBottom):-4107cell->setProperty("WrapText", true);  //内容过多,自动换行//cell->dynamicCall("ClearContents()");  //清空单元格内容QAxObject* interior = cell->querySubObject("Interior");interior->setProperty("Color", QColor(0, 255, 0));   //设置单元格背景色(绿色)QAxObject* border = cell->querySubObject("Borders"); border->setProperty("Color", QColor(0, 0, 255));   //设置单元格边框色(蓝色)QAxObject *font = cell->querySubObject("Font");  //获取单元格字体font->setProperty("Name", QStringLiteral("华文彩云"));  //设置单元格字体font->setProperty("Bold", true);  //设置单元格字体加粗font->setProperty("Size", 20);  //设置单元格字体大小font->setProperty("Italic", true);  //设置单元格字体斜体font->setProperty("Underline", 2);  //设置单元格下划线font->setProperty("Color", QColor(255, 0, 0));  //设置单元格字体颜色(红色)//设置单元格内容,并合并单元格(第5行第3列-第8行第5列)QAxObject *cell_5_6 = work_sheet->querySubObject("Cells(int,int)", 5, 3);cell_5_6->setProperty("Value", "Java");  //设置单元格值QAxObject *cell_8_5 = work_sheet->querySubObject("Cells(int,int)", 8, 5);cell_8_5->setProperty("Value", "C++");QString merge_cell;merge_cell.append(QChar(3 - 1 + 'A'));  //初始列merge_cell.append(QString::number(5));  //初始行merge_cell.append(":");merge_cell.append(QChar(5 - 1 + 'A'));  //终止列merge_cell.append(QString::number(8));  //终止行QAxObject *merge_range = work_sheet->querySubObject("Range(const QString&)", merge_cell);merge_range->setProperty("HorizontalAlignment", -4108);
merge_range->setProperty("VerticalAlignment", -4108);merge_range->setProperty("WrapText", true);merge_range->setProperty("MergeCells", true);  //合并单元格//merge_range->setProperty("MergeCells", false);  //拆分单元格//work_book->dynamicCall("Save()");  //保存文件(为了对比test与下面的test2文件,这里不做保存操作) work_book->dynamicCall("SaveAs(const QString&)", "E:\\test2.xlsx");  //另存为另一个文件 work_book->dynamicCall("Close(Boolean)", false);  //关闭文件excel.dynamicCall("Quit(void)");  //退出

 

效果如下:

操作前:

Qt之操作Excel

操作后:

Qt之操作Excel

    到这里很多人也许都在纳闷,单元格的宏怎么获取的?比如对齐方式(居中对齐),为什么值是-4108,而不是其他值呢?当然那不是我随便写的,自己可以录制宏,然后跟踪。

看下图:

Qt之操作Excel

相关文章:

使用QT操作Excel 表格的常用方法

VBA 简介 Microsoft Office软件通常使用VBA来扩展Windows的应用程序功能&#xff0c;Visual Basic for Applications&#xff08;VBA&#xff09;是一种Visual Basic的一种宏语言。 在VBA的参考手册中就可以看到具体函数、属性的用法&#xff0c;Qt操作Excel主要通过 QAxObj…...

vue前后端端口不一致解决方案

在config index.js文件中 引入如下代码即可 const path require(path) const devEnv require(./dev.env) module.exports {dev: {// PathsassetsSubDirectory: static,assetsPublicPath: /,proxyTable: devEnv.OPEN_PROXY false ? {} : {/api: {target: http://localhos…...

springcloudSeata处理分布式事务之1.7.0

1.5.0之后版本发生了很大改变 1.seata安装 1.1官网地址 http://seata.io/zh-cn/ 1.2下载地址 https://github.com/seata/seata/releases 下载的是seata-server-1.7.0.zip 1.3seata相关配置的修改 seata-server-1.7.0\seata\conf下的application.yml进行修改 server:por…...

每日刷题|回溯法解决全排列问题

​ 食用指南&#xff1a;本文为作者刷题中认为有必要记录的题目 前置知识&#xff1a;回溯法经典问题之组合 ♈️今日夜电波&#xff1a;爱人错过—告五人 1:11 ━━━━━━️&#x1f49f;──────── 4:52 …...

10-JVM调优工具详解

上一篇&#xff1a;09-JVM垃圾收集底层算法实现 前置启动程序 事先启动一个web应用程序&#xff0c;用jps查看其进程id&#xff0c;接着用各种jdk自带命令优化应用 1.Jmap 此命令可以用来查看内存信息&#xff0c;实例个数以及占用内存大小 jmap -histo 14660 #查看历史…...

东方博易oj——3119 - 约瑟夫问题2(链表)

文章目录 题目题目描述输入输出样例输入 输出标签 AC代码 题目 题目描述 约瑟夫问题&#xff1a;有 &#xff4e; &#xff4e; &#xff4e;只猴子&#xff0c;按顺时针方向围成一圈选大王&#xff08;编号从 &#xff11; &#xff11; &#xff11;到 &#xff4e; &#…...

C++,day0907

#include <iostream>using namespace std; struct stu { private:int num; private:double score[32];public:void setNum(){cout <<"请输入学生人数:";cin >>num;}void input(){cout<<"请输入学生的成绩:"<<endl;for(int i…...

孤儿僵尸守护进程的简单理解

孤儿进程&#xff1a; 一个父进程退出&#xff0c;而它的一个或多个子进程还在运行&#xff0c;那么那些子进程将成为孤儿进程。孤儿进程将被init进程所收养&#xff0c;并由init进程对它们完成状态收集工作。 如何模仿一个孤儿进程&#xff1a; 答案是&#xff1a; kill 父…...

学习笔记——Java入门第一季

1.1 Java的介绍与前景 Java语言最早期的制作者&#xff1a;James Gosling&#xff08;詹姆斯高斯林&#xff09; 1995年5月23日&#xff0c;Sun Microsystems公司宣布Java语言诞生。 1.2 Java的特性与版本 跨平台 开源&#xff08;开放源代码&#xff09; Java代码&#xff…...

更改注册表exe值后的惨痛经历

装软件时由于执行性文件打不开&#xff0c;搜索教程更改了exefile的值&#xff0c;最后整个电脑崩了&#xff0c;所有EXE都打不开&#xff0c;折腾了5个小时&#xff0c;什么办法都试了&#xff0c;甚至重置电脑都不让&#xff0c;打算拿电脑城修电脑了&#xff0c;突然搜到了一…...

stable diffusion实践操作-LyCORIS

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、LyCORIS是什么&#xff1f;二、使用步骤1.下载2.安装3 使用 二、整理模型1.LoHa-v1.0-pynoise 总结 前言 LyCORIS&#xff0c;可以理解为lora的加强版本。 LyCORIS - Lora beYond Conventional methods,…...

无需公网IP教你如何外网远程访问管家婆ERP进销存

文章目录 前言 1.管家婆服务2. 内网穿透2.1 安装cpolar内网穿透2.2 设置远程访问 3. 固定访问地址4. 配置固定公网访问地址 前言 管家婆辉煌系列产品是中小企业进销存、财务管理一体化的典范软件&#xff0c;历经十余年市场的洗礼&#xff0c;深受广大中小企业的欢迎&#xff…...

Swift使用编解码库Codable

Codable 是 Swift 引入的全新的编解码库&#xff0c;使开发者更方便的解析JSON 或 plist 文件。支持枚举、结构体和类。 Codable协议定义 Codable代表一个同时符合 Decodable 和 Encodable 协议的类型&#xff0c;即可解码且可编码的类型。 typealias Codable Decodable &a…...

Vue + Element UI 前端篇(三):工具模块封装

Vue Element UI 实现权限管理系统 前端篇&#xff08;三&#xff09;&#xff1a;工具模块封装 封装 axios 模块 封装背景 使用axios发起一个请求是比较简单的事情&#xff0c;但是axios没有进行封装复用&#xff0c;项目越来越大&#xff0c;会引起越来越多的代码冗余&am…...

【pytorch】数据加载dataset和dataloader的使用

1、dataset加载数据集 dataset_tranform torchvision.transforms.Compose([torchvision.transforms.ToTensor(),])train_set torchvision.datasets.CIFAR10(root"./train_dataset",trainTrue,transformdataset_tranform,downloadTrue) test_set torchvision.data…...

搭建单机版FastDFS分布式文件存储系统

一、准备工作 1、下载FastDFS安装包和依赖包 https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.43 https://codeload.github.com/happyfish100/fastdfs/tar.gz/V6.06 https://codeload.github.com/happyfish100/fastdfs-nginx-module/tar.gz/V1.22 注&…...

【验证码逆向专栏】房某下登录滑块逆向分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…...

Python 3.11 版本是对线程安全做了什么更改吗

问题&#xff1a;这份代码在 3.11.3 中它居然输出 0 &#xff0c;一度以为自己写错了&#xff0c;抱着不信邪的态度&#xff0c;又搞了个 Python 3.9.7 的环境试了下&#xff0c;果然还是符合自己预期&#xff0c;输出不为 0&#xff0c;想问下 3.11 版本中是做了什么修改吗&am…...

【Docker】镜像的创建、管理与发布

镜像的获取 镜像可以从以下方式获得&#xff1a; 从远程镜像仓库拉取&#xff0c;可以是公有仓库&#xff0c;也可以是私有仓库从Dockerfile构建从文件导入&#xff08;离线&#xff09;从容器提交 镜像的基本操作 跟镜像相关的命令如下&#xff1a; $ docker image --help…...

移动硬盘或U盘无法弹出的解决方法

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 最近在红米本win11中总遇到“该设备正在使用中”而无法弹出硬盘的问题。 解法该问题的思路&#xff1a;先定位占用该设备的进程&#xff0c;然后结束该进程。 定位进程 既然设备被占用&#xff0c;那肯定…...

如何极速获取金融市场数据:5分钟实战指南

如何极速获取金融市场数据&#xff1a;5分钟实战指南 【免费下载链接】qstock qstock由“Python金融量化”公众号开发&#xff0c;试图打造成个人量化投研分析包&#xff0c;目前包括数据获取&#xff08;data&#xff09;、可视化(plot)、选股(stock)和量化回测&#xff08;策…...

2026年实测10款降AI工具:毕业论文降AIGC哪款最靠谱?

2026年毕业季临近&#xff0c;降低论文AI生成痕迹、通过学校AIGC检测已经成为所有毕业生的必过关卡。但当前降AI工具市场鱼龙混杂&#xff1a;不少用户花了高价处理&#xff0c;AI率却纹丝不动&#xff1b;还有的工具改完的论文语句生硬、逻辑混乱&#xff0c;反而过不了答辩。…...

3步突破显卡限制:如何让AMD/Intel显卡实现DLSS级画质?

3步突破显卡限制&#xff1a;如何让AMD/Intel显卡实现DLSS级画质&#xff1f; 【免费下载链接】OptiScaler OptiScaler bridges upscaling/frame gen across GPUs. Supports DLSS2/XeSS/FSR2 inputs, replaces native upscalers, enables FSR3 FG on non-FG titles. Supports N…...

从信任根到信任链:构建坚不可摧的数字信任体系

1. 信任根&#xff1a;数字世界的安全基石 想象一下你正在建造一座摩天大楼。无论设计多么精妙&#xff0c;如果地基不牢固&#xff0c;整栋建筑都可能坍塌。在数字安全领域&#xff0c;**信任根&#xff08;Root of Trust, RoT&#xff09;**就是这样的地基。它是一个密码系统…...

5个核心功能让网盘用户彻底解决下载速度慢的问题

5个核心功能让网盘用户彻底解决下载速度慢的问题 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云盘 …...

游戏存档终极备份指南:用Ludusavi保护你的游戏进度

游戏存档终极备份指南&#xff1a;用Ludusavi保护你的游戏进度 【免费下载链接】ludusavi Backup tool for PC game saves 项目地址: https://gitcode.com/gh_mirrors/lu/ludusavi 你是否曾因电脑重装、系统崩溃或误操作而丢失珍贵的游戏存档&#xff1f;数百小时的游戏…...

保姆级教程:用CST 2023的RLC求解器搞定空心电感仿真(附网格优化技巧)

从零到精通的CST空心电感仿真实战指南&#xff1a;RLC求解器与网格优化全解析 在电磁兼容设计和高频电路开发中&#xff0c;空心电感作为无磁芯干扰的理想元件&#xff0c;其精确建模一直是工程师的痛点。传统手工计算难以应对复杂的高频效应&#xff0c;而商业仿真软件的门槛…...

告别CTex!TeX Live+Texstudio组合安装避坑指南(Windows/Mac双平台)

告别CTex&#xff01;TeX LiveTexstudio组合安装避坑指南&#xff08;Windows/Mac双平台&#xff09; 如果你曾经使用过CTex套装&#xff0c;可能会被其"开箱即用"的便利性所吸引。但当你需要跨平台协作或追求更灵活的定制时&#xff0c;TeX LiveTexstudio的组合无疑…...

Maven Versions Plugin 使用指南

以下是对你提供内容的补充和整理&#xff0c;形成一篇关于 Maven Versions Plugin 使用指南的文章&#xff1a;Maven Versions Plugin 使用指南 Maven Versions Plugin 是一套用于管理项目版本、依赖版本和父版本的工具集合。它可以帮助你高效地更新项目版本号、检查依赖更新、…...

智能影像雅鉴系统:丹青识画在美术馆导览中的落地实操

智能影像雅鉴系统&#xff1a;丹青识画在美术馆导览中的落地实操 1. 艺术与科技的完美融合 1.1 传统导览的痛点与革新 在美术馆参观时&#xff0c;我们常常面临这样的困境&#xff1a;站在一幅名画前&#xff0c;却无法真正理解其深层意境&#xff1b;面对珍贵文物&#xff…...