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