2011-06-08 55 views
0

當我在本地機器上運行調試模式時,沒有任何問題。我可以導出到Excel ...運行時錯誤 - 使用C#從IIS導出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」配置文件中創建一個標籤。這個標籤應該將其「模式」屬性設置爲「關」。

注意:你所看到的當前錯誤頁可以用自定義錯誤頁替換通過修改應用程序的配置標記的「defaultRedirect」屬性,使之指向自定義錯誤頁URL。

我的服務器爲Windows Server 2008/IIS7 THX對您有所幫助

+0

您的Windows Server 2008/IIS7上是否安裝了Excel? – Jay 2011-06-08 02:36:14

+0

yes alrdy installed office 2007 – CMMaung 2011-06-08 03:32:33

+0

我應該使用HTMLWriter和Response.Write嗎? – CMMaung 2011-06-08 03:37:09

回答

1

進入您的應用程序,並在你的web.config和你<的customErrors元素更改爲模式= 「關閉」,然後重試並在此發佈真實的錯誤消息。你可以做的另一件事是登錄到IIS機器並在那裏運行並看到完整的錯誤信息。

它可能是保存excel文件的權限,或者它可能是啓動excel的錯誤,但我們需要在這裏看到錯誤消息。確保您保存文件的位置對網絡服務帳戶(或任何您將應用程序作爲其應用程序池帳戶在iis中運行的帳戶)具有權限

請參閱以下鏈接,瞭解許多其他許多其他(更好)的方法來做到這一點。

Create Excel (.XLS and .XLSX) file from C#

+0

其實我無法在IIS機器上運行因爲我使用Windows身份驗證。無論我嘗試過,我從服務器收到此錯誤消息...由於沒有足夠的可用內存或磁盤空間,Microsoft Office Excel無法打開或保存更多文檔。 •要提供更多內存,請關閉不再需要的工作簿或程序。 •要釋放磁盤空間,請從您保存的磁盤中刪除不再需要的文件。 – CMMaung 2011-06-09 05:32:52

+0

這是錯誤消息:「System.NullReferenceException:對象引用未設置爲對象的實例。在System.Runtime.InteropServices.Marshal.ReleaseComObject(Object o)at PMIS.POStatus.releaseObject(Object obj)in C: \正在開發\ PMIS \ PMIS \ POStatus.aspx.cs:行263「 – CMMaung 2011-06-10 05:21:24

1
  1. 的Excel需要在服務器上安裝了這個工作。

  2. 查看完整例外的另一種方法是,如果您有權訪問服務器桌面,則可以從服務器導航到您的頁面,因爲它是本地的,您將獲得完整的堆棧跟蹤。

  3. 微軟表示:這是一個明確勸阻在服務器上使用Excel的方法:http://support.microsoft.com/kb/257757。首選的方法是使用可以讀取和/或操縱xls和xlsx文件的庫/ dll,而無需啓動和自動化某些其他應用程序。有免費的圖書館,如NPOI和商業產品,如SpreadsheetGear和Aspose。如果將用法限制爲xlsx,則有更多選項。

  4. 如果你使用這種互操作方法:

    一個。您需要更仔細地將所有項目分配給變量以供日後清理。例如,每次在循環中執行oSheet.Cells[1, i]時,都會泄漏單元格引用。

    b。您分配的每個資源必須在完成時通過撥打Marshal.ReleaseComObject(theVariable)進行清理。這些東西不是垃圾收集,所以GC.Anything將不起作用。

    c。您的try…catch重定向不會清除在異常或關閉Excel之前獲取的任何資源,這意味着每次在此方法中遇到異常時,您都有可能在後臺運行幻影Excel實例。您可能需要使用try…catch…finally並在finally區塊中執行所有清理。

+0

後我更改了try catch異常,我從服務器收到此錯誤消息... Microsoft Office Excel無法打開或保存更多的文檔,因爲那裏沒有足夠的可用內存或磁盤空間。 •要提供更多內存,請關閉不再需要的工作簿或程序。 •要釋放磁盤空間,請從您保存的磁盤中刪除不再需要的文件。 我無法在服務器上運行瀏覽器上的應用程序cos我使用Windows身份驗證。感謝您的回覆 – CMMaung 2011-06-08 03:26:47

+1

@CMMaung您是否可以在服務器上打開任務管理器或Process Explorer以查看是否運行了幻影Excel實例?您可能需要手動殺死所有這些進程才能繼續。 – Jay 2011-06-08 13:27:32

+0

這是錯誤消息:「System.NullReferenceException:對象引用未設置爲對象的實例。在System.Runtime.InteropServices.Marshal.ReleaseComObject(Object o)at PMIS.POStatus.releaseObject(Object obj)in C: \ Under Development \ PMIS \ PMIS \ POStatus.aspx.cs:line 263「 – CMMaung 2011-06-10 05:21:40