我正在尝试自动化Excel,以便它在服务器上生成报告,然后在请求时将其通过电子邮件发送给用户。我遇到的问题是,一旦我创建了一个excel文档并将数据写入其中,即使在发出pXL-> Quit()之后程序也不会退出;命令。 这就是我关于“关闭”的说法:
pXL->Workbooks->Close(LCID(LOCALE_USER_DEFAULT));
pXLWSs.Reset(); //Releases Worksheets
pXLWS.Reset();//Releases Workbooks
pXL->Quit();// "Quits" Excel ---> This does not quit excel
pXL.Reset();//Release Excel application?
CoUninitialize();//Uninitialise COMS
我已经阅读了很多关于这个特定问题的文章和博客,似乎这是因为我没有释放所有与Excel相关的COMS。所以我尝试了几次uninitialising COMS。我发了
CoUninitialize();
4次,这有效!但令我失望的是,它并不是一直有效。
有谁知道如何优雅地关闭Excel?
我知道Microsoft不支持服务器端Excel Automation,但我希望找到一个解决方法。 我也知道你可以简单地
WinExec("taskkill /F /IM \"excel.exe\"",0);
完全杀死了Excel,但我担心应用程序的未来会产生相当多的excel应用程序,在这种情况下,我必须单独杀死Excel,这一切都只是从那里变得混乱....
非常感谢任何帮助!
答案 0 :(得分:0)
解决!
所以我终于提出了一种方法来杀死在后台运行的Excel剩下的东西。
当我创建Excel时,我使用:
存储其PID(进程标识符)GetWindowThreadProcessId((HWND)pXL->Hwnd, &ExcelprocessID);
然后在写入数据的时候杀死应用程序:
pXL->Workbooks->Close(LCID(LOCALE_USER_DEFAULT));
pXLWSs.Reset();
// Better to use "Reset", which will clear all references to this pointer
// rather than "Release", which will only clear the last reference
pXLWS.Reset();
pXL->Quit();
pXL.Reset();
CoUninitialize();
if ( ExcelprocessID == 0 )
{
ShowMessage("Could not find Excel ProcessID to close");
}
else
{
HANDLE tmpHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, ExcelprocessID);
if (NULL != tmpHandle)
{
TerminateProcess(tmpHandle, 0);
}
}
希望这可以帮助那些一直在寻找解决方案的人......