QT QAxobject 无法关闭Excel后台进程

项目场景:

我在使用QT开发时,为了读写xls,xlsx文件,使用到了QAxobject,但有时会遇到一个问题,excel进程停留在后台,不会自动关闭。


问题描述

明明已经在代码中添加了workbook->dynamicCall(“Close()”)
但是打开任务管理器,进程仍然存在


QAxObject excel("Excel.Application");
excel.setProperty("Visible", false);
excel.setProperty("DisplayAlerts", false);
QAxObject *workbooks = excel.querySubObject("Workbooks");
QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filePath);
workbook->dynamicCall("Save()");//保存excel文件
workbook->dynamicCall("Close()");//关闭excel进程
workbooks->dynamicCall("Close()");
excel.dynamicCall("Quit()");
delete workbook;
delete workbooks;

原因分析:

workbook->dynamicCall(“Save()”); 和 workbook->dynamicCall(“Close()”); 则是使用默认参数的 dynamicCall 函数来保存和关闭工作簿,有时确实会造成工作工作簿没有被正确关闭。


解决方案:

使用以下代码:
workbook->dynamicCall(“Save()”, true);
workbook->dynamicCall(“Close(Boolean)”, true);

这是使用了带有布尔参数的 dynamicCall 函数来保存和关闭工作簿。这与原来代码的区别在于是否传递了布尔参数。布尔参数用于指定是否强制执行操作。如果参数为 true,则表示强制执行操作;如果参数为 false 或者省略参数,则表示按照默认行为执行操作。

在这种情况下,Save() 函数用于保存工作簿,Close() 函数用于关闭工作簿。通过传递 true 参数,可以强制执行保存和关闭操作,确保工作簿被正确保存和关闭。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中使用QAxObject来创建Excel文件的步骤如下: 首先,确保你已经安装了Microsoft Office软件,并且拥有Excel的许可证。 然后,你需要在Qt项目中添加以下代码段: ```cpp #include <QAxObject> ... QAxObject* excel = new QAxObject("Excel.Application", this); // 创建Excel应用程序对象 excel->dynamicCall("SetVisible(bool)", false); // 设置Excel应用程序不可见 QAxObject* workbooks = excel->querySubObject("Workbooks"); // 获取工作簿集合对象 QAxObject* workbook = workbooks->querySubObject("Add"); // 创建新工作簿 QAxObject* worksheets = workbook->querySubObject("Worksheets"); // 获取工作表集合对象 QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1); // 获取第一个工作表 QAxObject* cells = worksheet->querySubObject("Cells"); // 获取单元格集合对象 // 在A1单元格中写入数据 QAxObject* cell = cells->querySubObject("Item(int,int)", 1, 1); cell->dynamicCall("SetValue(const QVariant&)", "Hello, Excel!"); workbook->dynamicCall("SaveAs(const QString&)", "C:/path/to/excel.xlsx"); // 保存工作簿 workbook->dynamicCall("Close()"); // 关闭工作簿 excel->dynamicCall("Quit()"); // 退出Excel应用程序 ``` 上述代码中,我们使用QAxObject来创建Excel应用程序对象、工作簿、工作表、单元格等。你可以根据需要进行更多的操作,比如设置单元格格式、写入更多数据等。 最后,记得在结束程序前释放资源,可以在程序退出时执行以下代码: ```cpp delete excel; ``` 请确保将代码中的文件路径替换为你希望保存Excel文件的路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值