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

qt使用QAxObject操作excel程序关闭之后excel进程未被关闭的解决方案

💂 个人主页:pp不会算法^ v ^
🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主
💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

今天突然发现电脑变得很卡,我以为内存占用率过高了一看才50%,又以为c盘满了一看还有50多G,后面打开任务管理器我被吓了一条,几十个excel进程,

后面想了一下应该是我那个导出excel的qt程序引起的,然后我运行程序发现开启了四个excel进程,程序关闭之后这四个进程却没有结束,由于通过QAxObject去操作excel的时候使用的是本机的excel软件所以会开启excel进程,但是我明明在析构函数中执行了这句:

    if (excelApp) {//关闭工作簿if(workBook!=nullptr)workBook->dynamicCall("Close(Boolean)",true);//关闭excelexcelApp->dynamicCall("Quit()");delete excelApp;excelApp = nullptr;}

后面经过多次尝试和查阅资料我总结出了两种解决办法:
1、连接excel控件的时候选择显示窗体

    excelApp = new QAxObject();// 连接Excel控件excelApp->setControl("Excel.Application");// 显示窗体excelApp->dynamicCall("SetVisible(bool)","true");// 不显示任何警告信息。如果为true那么在关闭时会出现类似“文件已修改,是否保存”的提示

这样程序结束之后进程可以正常结束

2、workbook->dynamicCall(“Save()”); 和 workbook->dynamicCall(“Close()”); 改为: workbook->dynamicCall(“Save()”, true); workbook->dynamicCall(“Close(Boolean)”, true);

原因就是如果显示指定flag参数为true会执行强制操作

    if (workBook){QAxObject *worksheets =workBook->querySubObject("Sheets");//获取工作表集合QAxObject *first_sheet = worksheets->querySubObject("Item(int)", 1);first_sheet->dynamicCall("Select()");//选中 sheetint sheet_count = worksheets->property("Count").toInt();  //获取工作表数目first_sheet = worksheets->querySubObject("Item(int)", sheet_count);first_sheet->dynamicCall("delete");//删除最后一个sheet页,为:sheet1}//保存至filepath,注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"\",不然一定保存不了。workBook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(fileName),true);// 关闭 Excel 文件workBook->dynamicCall("Close(Boolean)",true);

相关文章:

  • 【C++】三大特性之继承
  • Kafka|处理 Kafka 消息重复的有效措施
  • 线性代数 --- 特征值与特征向量(下)
  • CTP-API开发系列之五:SimNow环境介绍
  • 0102全排列和对换-行列式-线性代数
  • LeetCode每日一题之 快乐数
  • Rust常用特型之Drop特型
  • 【Python】科研代码学习:六 ModelOutput,SpecificModel
  • Rust有没有信号量机制,在缓存有数据的时候才允许等待的进程取数据?
  • 【Go】令牌桶限流算法
  • Unity Text文本实现滚动跑马灯效果
  • (MATLAB)第五章-矩阵运算
  • okHttp MediaType MIME格式详解
  • Java的堆如何分代的?
  • 吴恩达机器学习笔记十六 如何debug一个学习算法 模型评估 模型选择和训练 交叉验证测试集
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Android交互
  • AWS实战 - 利用IAM对S3做访问控制
  • Js基础——数据类型之Null和Undefined
  • js中forEach回调同异步问题
  • Laravel Telescope:优雅的应用调试工具
  • miaov-React 最佳入门
  • mysql innodb 索引使用指南
  • Netty源码解析1-Buffer
  • nodejs调试方法
  • node和express搭建代理服务器(源码)
  • PAT A1092
  • REST架构的思考
  • select2 取值 遍历 设置默认值
  • spring boot 整合mybatis 无法输出sql的问题
  • vue总结
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 前端性能优化——回流与重绘
  • 巧用 TypeScript (一)
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 提醒我喝水chrome插件开发指南
  • 以太坊客户端Geth命令参数详解
  • Linux权限管理(week1_day5)--技术流ken
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • (4)(4.6) Triducer
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (HAL库版)freeRTOS移植STMF103
  • (LeetCode) T14. Longest Common Prefix
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (七)Java对象在Hibernate持久化层的状态
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十一)手动添加用户和文件的特殊权限
  • (一)为什么要选择C++
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • ***监测系统的构建(chkrootkit )
  • .Net Web项目创建比较不错的参考文章