Interop中不退出Excel应用程序

use*_*334 0 c# asp.net excel impersonation excel-interop

我正在使用以下代码在ASP.net表单上动态写入excel文件,该表单可以将数据表保存为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();
Run Code Online (Sandbox Code Playgroud)

数据被正确写入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
Run Code Online (Sandbox Code Playgroud)

我没有使用proc.Kill()方法,而是尝试使用excel.Quit()方法,但该过程不会终止.当我这样做时,每次用户尝试生成报告时,我都会使用新的Excel流程.

我在web.config文件中有用户模拟,但这不会改变任何东西.

  <system.web>
    <identity impersonate="true" userName="xxxxxx" password="xxxxxxxx" />
  </system.web>
Run Code Online (Sandbox Code Playgroud)

关于如何避免异常并确保excel进程终止正常的任何指针?我已经尝试过我在这里找到的COM清理解决方案,但它不起作用..

Yah*_*hia 5

MS不支持在服务器上使用Interop(如ASP.NET) - 请参阅http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

由于Windows Vista MS引入了一些与安全相关的措施,这些措施阻止Windows服务执行"类似桌面"的操作......这意味着您必须绕过几个安全措施才能使其工作(不推荐!).

要在服务器场景中处理Excel,有几个选项(免费和商业):

我可以推荐Aspose.CellsFlexcel ...没有尝试过SpreadsheetGear但是听到+阅读了很多关于它的好东西......

免费选项(仅适用于较新的xlsx格式!)例如 来自MSEPPlus的OpenXML 2.

  • EPPlus很棒! (2认同)