我正在使用以下代码在可以将数据表保存到 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 清理解决方案,但它不起作用..