项目场景: 我在使用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 参数,可以强制执行保存和关闭操作,确保工作簿被正确保存和关闭。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。