0

我正在尝试自动化 Excel,以便它在服务器上生成报告,然后在请求时通过电子邮件将其发送给用户。我遇到的问题是,一旦我创建了一个 excel 文档并将数据写入其中,即使发出 pXL->Quit(); 程序也不会退出;命令。这就是我“关闭”excel的说明:

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。所以我尝试了几次取消初始化 COMS。我发出了

CoUninitialize(); 

4次,这有效!但令我失望的是,它并不总是有效。

有谁知道如何优雅地关闭Excel?

我知道微软不支持服务器端 Excel 自动化,但我希望能找到解决办法。我也知道你可以简单地

WinExec("taskkill /F /IM \"excel.exe\"",0); 

这完全杀死了 Excel,但我担心该应用程序的未来会生成相当多的 Excel 应用程序,在这种情况下,我将不得不单独杀死 Excel,这一切都会从那里变得一团糟......

任何帮助将非常感激!

4

1 回答 1

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);
    }
}

希望这可以帮助其他一直在寻找解决方案的人....

于 2012-08-30T09:44:30.970 回答