2012-07-31 69 views
0

我試圖自動化Excel,以便它在服務器上生成報告,然後在請求時通過電子郵件將此報告發送給用戶。我遇到的問題是,一旦我創建了一個excel文檔並將數據寫入其中,程序即使在發出pXL-> Quit()後也不會退出。命令。 這就是我的「關閉」指令擅長:Embarcadero C++構建器Excel自動化C++不會退出

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的單獨和它只是從那裏得到凌亂....

任何幫助將不勝感激!

+0

pXL,pXLWSs和PXLWS的數據類型是什麼? – 2012-07-31 15:03:08

+0

此外,請檢查http://stackoverflow.com/q/4852135/25507,看看是否適用於您的情況。 – 2012-07-31 15:07:56

+0

它們是COM接口。 TComInterface PXL; – dRagonsRage 2012-07-31 15:09:10

回答

0

解決!

所以我終於想出了一種辦法來殺掉在後臺運行的Excel剩下的東西。

然後寫入數據之後
GetWindowThreadProcessId((HWND)pXL->Hwnd, &ExcelprocessID); 

當其時殺應用程序:

當我創建Excel中,我使用存儲其PID(進程標識符)

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

希望這有助於任何人誰一直在尋找解決方案......

+0

btw,pXL是我用於Excel的包裝的應用程序指針... – dRagonsRage 2012-08-30 09:46:14