使用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

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

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

相关文章

Verilog零基础入门(边看边练与测试仿真)-笔记

文章目录 第一讲第二讲第三讲第四讲第五讲 第一讲 1、testbench 没有端口&#xff0c;所以没括号 2、testbench 输入端 之后要变动 所以定义为reg 3、#10 &#xff1a;过10个时间单位 &#xff1b;’timescale 1ns/10ps 即 1ns 的时间单位 10ps的时间精度 4、reg 型变量赋值的…

鼠标悬停阴影的效果被旁边div挡住的解决办法

出现的问题 需求要求鼠标悬停某个图片上有阴影效果&#xff0c;但阴影被旁边相邻的div挡住了&#xff0c;如图所示 解决方案 给悬停的这块div增加2个css属性 $(this).css(position, relative); $(this).css(z-index, 200);新的效果如图所示 一直写后端&#xff0c;前端的…

opencv案例06-基于opencv图像匹配的消防通道障碍物检测与深度yolo检测的对比

基于图像匹配的消防通道障碍物检测 技术背景 消防通道是指在各种险情发生时&#xff0c;用于消防人员实施营救和被困人员疏散的通道。消防法规定任何单位和个人不得占用、堵塞、封闭消防通道。事实上&#xff0c;由于消防通道通常缺乏管理&#xff0c;导致各种垃圾&#xff0…

用java的Arrays类实现数组拷贝

java.util.Arrays类有几个静态的针对不同类型数据的数组拷贝方法。 示例 用copyOf(byte[] original, int newLength)拷贝 copyOf(byte[] original, int newLength)&#xff0c;将原数组的内容拷贝到新的数组中&#xff0c;截取或者填充&#xff08;如果长度不够&#xff0c;…

Linux命令之用户管理(详解)

Linux命令之用户管理 常用基础命令修改root密码切换用户身份改变当前目录查看命令的用法查看命令之ls 用户管理用户的创建adduser创建useradd创建两种方式的区别 用户删除用户密码重置查看当前所有用户 在介绍Linux用户管理相关的命令之前&#xff0c;我们先介绍一些Linux的一些…

【Linux】高级IO和多路转接 | select/poll/epoll

多路转接和高级IO 咳咳&#xff0c;写的时候出了点问题&#xff0c;标点符号全乱了&#xff08;批量替换了几次&#xff09;&#xff0c;干脆就把全文的逗号和句号都改成英文的了&#xff08;不然代码块里面的代码都是中文标点就跑不动了&#xff09; 1.高级IO 1.1 五种IO模型…

对负载均衡的全面理解

title: 对负载均衡的全面理解 date: 2021-07-10 21:41:24 tags: TCP/IP 对负载均衡服务(LBS)大名入行不多久就一直听闻&#xff0c;后来的工作中&#xff0c;也了解到 软件负载均衡器&#xff0c;如被合入Linux内核的章文嵩的LVS&#xff0c;还有以应用程序形式出现的HAProxy、…

【1day】PHPOK cms SQL注入学习

目录 一、漏洞描述 二、资产测绘 三、漏洞复现 四、漏洞修复 一、漏洞描述 PHPOK CMS是一个基于PHP语言开发的开源内容管理系统(CMS)。它提供了一个强大的平台,用于创建和管理网站内容。PHPOK CMS具有灵活的模块化架构,可以根据网站的需求进行定制和扩展。PHPOK CMS存…

onnx 模型切割掉conv后面的节点,设置输出层名称和最后节点名称一致,设置输出层shape和输出节点一致.

某些模型最后卷积层之后的算子不适合在推理引擎里面跑&#xff0c;切割掉conv后面的算子&#xff0c;在cpu上实现有比较好的性能&#xff0e; 包含&#xff1a; &#xff11;&#xff0e;获取onnx中间节点的shape的示例 &#xff12;&#xff0e;增加onnx模型输出&#xff0c;设…

音视频技术开发周刊 | 309

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 腾讯云音视频及边缘平台专场邀你一起见证“连接”的力量 9月7日&#xff0c;腾讯全球数字生态大会之腾讯云音视频及边缘平台专场即将开启&#xff01;本次专场将重点分享腾…

【LeetCode】312.戳气球

题目 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和…

【Docker】 08-Dockerfile

什么是Dockerfile Dockerfile可以认为是Docker镜像的描述文件&#xff0c;是由一系列命令和参数构成的教程&#xff0c;主要作用是用来构建docker镜像的构建文件。 Dockerfile解析过程 Dockerfile的保留命令 保留字作用FROM当前镜像是基于哪个镜像的 第一个指令必须是FROMMA…

C# 类class、继承、多态性、运算符重载,相关练习题

34.函数重载 /*函数重载您可以在同一个范围内对相同的函数名有多个定义。函数的定义必须彼此不同&#xff0c;可以是参数列表中的参数类型不同&#xff0c;也可以是参数个数不同。不能重载只有返回类型不同的函数声明。下面的实例演示了几个相同的函数 Add()&#xff0c;用于对…

测试理论与方法----测试流程第三个环节:设计测试用例

测试流程第三个环节&#xff1a;设计测试用例&#xff1a;怎么测<——>测试需求的提取&#xff1a;测什么 ### 5、测试用例 描述&#xff1a;测试用例(TestCase)&#xff1a;是一份关于【具体测试步骤】的文档&#xff0c;是为了达到最佳的测试效果或高效揭露软件中潜藏的…

外包干了2个月,技术退步明显了...

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年8月份&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

【postgresql 基础入门】psql客户端的使用方法

psql 客户端使用 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xf…

【gtpJavaScript】使用JavaScript实现套壳gtp与gtp打字输出效果

postman测试gtp接口 https://platform.openai.com/docs/api-reference/chat/create?langcurl 导入到postman中 记得弄一个gtp的key 然后请求测试gtp接口&#xff1a; 纯前端实现gtp请求页面 目录结构&#xff1a; 部分参考&#xff1a;GitHub - xxxjkk/chat-website: 简易版c…

【ActiveMQ】Failed to start Apache ActiveMQ (localhost, ID_XXX)

问题描述 使用"bin\win64\activemq.bat"启动apache-activemq-5.18.2出错。 jvm 1 | ERROR | Failed to start Apache ActiveMQ (localhost, ID:) jvm 1 | java.io.IOException: Transport Connector could not be registered in JMX: java.io.IOException: F…

Linux下的系统编程——文件与目录操作(六)

前言&#xff1a; 在Linux系统中&#xff0c;文件和目录的操作非常灵活。用户可以通过命令行或者图形界面来进行操作。下面是Linux文件和目录操作的一些常见操作&#xff1a; 目录 一、文件系统 1.inode 2.dentry 二、文件操作 1.stat/lstat&#xff1a; 2.link/unlink…

OpenCV:实现图像的负片

负片 负片是摄影中会经常接触到的一个词语&#xff0c;在最早的胶卷照片冲印中是指经曝光和显影加工后得到的影像。负片操作在很多图像处理软件中也叫反色&#xff0c;其明暗与原图像相反&#xff0c;其色彩则为原图像的补色。例如&#xff0c;颜色值A与颜色值B互为补色&#…