4

Excel ファイルを作成した後、タスク マネージャーから Excel を解放する際に問題が発生し、C# から保存して閉じます。

次のコードを使用して、Excel インスタンスを作成します。

 Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

Microsoft.Office.Interop.Excel.Workbook workbook = xlApp.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];

次に、ワークシートにデータを入力します。

worksheet.Cells[1, 1] = "Test";
worksheet.Cells[1, 2] = "Test";
worksheet.Cells[1, 3] = "Test";
worksheet.Cells[1, 4] = "Test";

その後、ワークブックを保存します。

workbook.SaveAs(filePath);

次に閉じます。

workbook.Close(false, false);

その後、Excel を終了します。

xlApp.Quit();

しかし、これを行った後でも、タスク マネージャーに Excel が表示されます!!?!?

xlApp.Quit() を呼び出した後、これが閉じられない理由は何ですか?

前もって感謝します。

4

3 に答える 3

6

Interop を削除し、 EPPlusを使用して Excel ファイルを作成/変更してみてください。これは非常に簡単で、コンピューターに Office をインストールする必要はありません。

しかし、本当に Interop を使用したい場合は、これが役立つかもしれません (数分で 800 以上の Excel ファイルを作成しなければならなかったため、すべてが適切に破棄されるようにコードで使用しています)。

        workBook.Close(true, filePathTarget, Missing.Value);
        app.DisplayAlerts = true;
        app.Quit();
        Release(workSheet2);
        Release(workSheet1);
        Release(workBook);
        Release(workBooks);
        Release(app);
        workSheet2 = null;
        workSheet1 = null;
        workBook = null;
        workBooks = null;
        app = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();

どこ:

 private static void Release(object obj) {
        // Errors are ignored per Microsoft's suggestion for this type of function:
        // http://support.microsoft.com/default.aspx/kb/317109
        try {
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj);
        } catch {
        }
    }

ただし、XLSX ファイルのみを扱う場合は、EPPlus を使用することを強くお勧めします。うまく機能し、高速で効率的で、Microsoft Office がインストールされていることを中継しません。1 時間使用した後、5 分後に Interop を削除しました...

于 2012-04-18T15:23:15.370 に答える
0

汚れているように見える process.kill メソッドを使用しましたが、非常にうまく機能します。

dim xlHWND= Xlapp.Hwnd
Dim proc = Process.GetProcessesByName("excel")
For i As Integer = 0 To proc.Count - 1
     If proc(i).MainWindowHandle = xlHWND Then
          proc(i).Kill()
     End If
Next
于 2022-02-05T16:42:41.860 に答える
0

COM 参照を解放するには、xlApp 変数を null に設定する必要があります。参照カウントがゼロではないため、インスタンスを開いたままにしているのはおそらく COM です。

xlApp = null;
于 2012-04-18T15:25:05.993 に答える