次のコードを使用して、データ テーブルを Excel に保存できる ASP.net フォームで Excel ファイルに動的に書き込みます。
//Create Excel Object
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(target);
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
worksheet.Name = "Worksheet1";
excel.Visible = false;
//Generate Fields Name
foreach (DataColumn col in dataTable.Columns)
{
colIndex++;
excel.Cells[1, colIndex] = col.ColumnName;
}
object[,] objData = new object[rowNo, columnNo];
for (int row = 0; row < rowNo; row++)
{
for (int col = 0; col < columnNo; col++)
{
objData[row, col] = dataTable.Rows[row][col];
}
}
Microsoft.Office.Interop.Excel.Range range;
range = worksheet.Range[excel.Cells[2, 1], excel.Cells[rowNo + 1, columnNo]];
range.Value2 = objData;
worksheet.Columns.AutoFit();
workbook.Save();
workbook.Close();
IntPtr hwnd = new IntPtr(excel.Hwnd);
IntPtr processId;
IntPtr foo = GetWindowThreadProcessId(hwnd, out processId);
Process proc = Process.GetProcessById(processId.ToInt32());
proc.Kill();
//excel.Quit();
GC.Collect();
GC.WaitForPendingFinalizers();
データはExcelファイルに正常に書き込まれます。ただし、上記のように proc.Kill() を使用してプロセスを強制終了しようとすると、次の例外が発生します
説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。
例外の詳細: System.ComponentModel.Win32Exception: アクセスが拒否されました
ソース エラー:
現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。
スタックトレース:
[Win32Exception (0x80004005): Access is denied]
System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited) +1985316
System.Diagnostics.Process.Kill() +49
Faculty_Report1.FetchData_EXCEL(String prog, String cls, String spcln, String fromdate, String todate) +2413
Faculty_Report1.fetchselectedvalues_EXCEL() +1044
System.Web.UI.WebControls.ImageButton.OnClick(ImageClickEventArgs e) +187
System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +165
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3707
proc.Kill() メソッドを使用する代わりに、excel.Quit() メソッドを使用してみましたが、プロセスが終了しません。これを行うと、ユーザーがレポートを生成しようとするたびに、新しい Excel プロセスが作成されます。
web.config ファイルにユーザーの偽装がありますが、何も変わりません。
<system.web>
<identity impersonate="true" userName="xxxxxx" password="xxxxxxxx" />
</system.web>
例外を回避し、Excel プロセスが正常に終了することを確認する方法についての指針はありますか? ここで見つけた COM クリーンアップ ソリューションを試しましたが、うまくいきません。