0

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を解放していないためと思われます。そこで、COMSの初期化を数回試みました。私は

CoUninitialize(); 

4回、これはうまくいきました!しかし、残念ながら、それは常に機能するわけではありません。

Excelを正常に閉じる方法を知っている人はいますか?

Microsoftがサーバー側のExcelAutomationをサポートしていないことは知っていますが、回避策を見つけたいと思っていました。私はあなたが簡単にできることも知っています

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 に答える