运行时错误 – 使用C#从IIS导出Excel
当我在本地机器上运行debugging模式时,没有任何问题。 我可以出口到Excel …
private void ExportToExcel(string str) { _Excel.Application oXL; _Excel.Workbook oWB; _Excel.Worksheet oSheet; _Excel.Range oRange; // Start Excel and get Application object. oXL = new _Excel.Application(); // Set some properties oXL.Visible = true; oXL.DisplayAlerts = false; // Get a new workbook. oWB = oXL.Workbooks.Add(Missing.Value); // Get the active sheet oSheet = (_Excel.Worksheet)oWB.ActiveSheet; oSheet.Name = "PO_Status"; // Process the DataTable int rowCount = 1; foreach (DataRow dr in dtStatus(str).Rows) { rowCount += 1; for (int i = 1; i < dtStatus(str).Columns.Count + 1; i++) { // Add the header the first time through if (rowCount == 2) { oSheet.Cells[1, i] = dtStatus(str).Columns[i - 1].ColumnName; } oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); } } // Resize the columns oRange = oSheet.get_Range(oSheet.Cells[1, 1], oSheet.Cells[rowCount, dtStatus(str).Columns.Count]); oRange.EntireColumn.AutoFit(); try { // Save the sheet and close oSheet = null; oRange = null; oWB.SaveAs("POStatus.xls", _Excel.XlFileFormat.xlWorkbookNormal, Missing.Value, Missing.Value, Missing.Value, Missing.Value, _Excel.XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); //oWB.Close(Missing.Value, Missing.Value, Missing.Value); //oWB = null; //oXL.Quit(); // Clean up // NOTE: When in release mode, this does the trick GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } catch (Exception ex) { Session["error"] = ex.Message; Response.Redirect("MessageBoard.aspx"); } } private DataTable dtStatus(string str) { DataTable dt = new DataTable(); SqlCommand cmd = new SqlCommand(@"Select " + str + "" + " From tbl_RFI Full Join" + " tbl_RFQ On tbl_RFI.RFINo = tbl_RFQ.RFINo Full Join" + " tbl_NNB On tbl_RFQ.RFQNo = tbl_NNB.RFQNo Full Join" + " tbl_PO On tbl_PO.NNBNo = tbl_NNB.NNBNo" + " Where tbl_RFI.JobNo = '" + ddlJobNo.SelectedValue.ToString().Trim() + "'", connPMis); SqlDataAdapter adp = new SqlDataAdapter(cmd); adp.Fill(dt); return dt; } }
但是,当我在IIS上运行,它不工作…我得到这样的错误信息
运行时错误说明:服务器上发生应用程序错误。 此应用程序的当前自定义错误设置阻止了远程查看应用程序错误的细节(出于安全原因)。 但是,它可以通过在本地服务器上运行的浏览器来查看。
详细信息:要使此特定错误消息的详细信息可在远程计算机上查看,请在位于当前Web应用程序的根目录下的“web.config”configuration文件中创build一个标记。 这个标签的“模式”属性设置为“关”。
注意:通过修改应用程序configuration标记的“defaultRedirect”属性指向自定义错误页面URL,您可以看到当前显示的错误页面可以由自定义错误页面replace。
我的服务器是Windows Server 2008 / IIS7 thx的帮助
-
Excel需要安装在服务器上才能正常工作。
-
另一种可以看到完全例外的方式是,如果你有权访问服务器桌面,你可以从服务器导航到你的页面,因为它是本地的,你将得到完整的堆栈跟踪。
-
微软表示,这是在服务器上使用Excel的一个明显不鼓励的方法。 首选的方法是使用可以读取和/或操作xls和xlsx文件的库/ dll,而无需启动和自动化某些其他应用程序。 有免费的图书馆,如NPOI和商业产品,如SpreadsheetGear和Aspose。 如果将用法限制为xlsx,则有更多的选项。
-
如果你使用这种互操作方法:
一个。 您需要更仔细地将所有项目分配给variables以便以后清理。 例如,每次在循环中执行
oSheet.Cells[1, i]
时,都会泄漏单元格引用。湾 您分配的每个资源必须通过调用
Marshal.ReleaseComObject(theVariable)
进行清理。 这些东西不是垃圾收集,所以GC.Anything
将没有任何效果。C。 您的
try…catch
redirect而不清除在exception或closuresExcel之前获取的任何资源,这意味着每次在此方法中遇到exception时,您都有可能在后台运行一个幻影Excel实例。 你可能需要使用try…catch…finally
,并在finally
块中完成所有的清理工作。
进入你的应用程序,并在你的web.config中,并将<customErrors元素更改为mode =“Off”,然后重试并在此处发布真实的错误消息。 你可以做的另一件事是login到IIS机器并在那里运行,看到完整的错误信息。
它可能是保存excel文件的权限,或者可能是启动excel时出错,但是我们需要在这里看到错误信息。 确保您保存文件的位置对networking服务帐户(或者您的应用程序运行在iis中作为其应用程序帐户的任何帐户)具有权限,
请参阅以下链接,了解许多其他(更好)的方法。
从C#创buildExcel(.XLS和.XLSX)文件