2014-03-19 218 views
0

我在寫LigthSwitch應用程序,其中一個要求是將數據導出到Excel。我完成了這樣的任務。當應用程序在本地主機上運行時,它可以很好地工作。然而,當我上傳應用程序到SharePoint網站我獲得以下錯誤:Excel 500(內部服務器錯誤)

無法加載資源:服務器500(內部服務器錯誤)的狀態https://437aa483-68ef-4ae1-9269-b206f5beb418.o365apps.net/setExcelDocument.ashx

下面是示例代碼迴應(只要複製,參考excel.dll並添加觸發器):

 private Microsoft.Office.Interop.Excel.Application app = null; 
     private Microsoft.Office.Interop.Excel.Workbook workbook = null; 
     private Microsoft.Office.Interop.Excel.Worksheet worksheet = null; 
     private Microsoft.Office.Interop.Excel.Range workSheet_range = null; 

     private void createOpportunity() 
     { 
      try 
      { 
       app = new Microsoft.Office.Interop.Excel.Application(); 
       app.Visible = true; 
       workbook = app.Workbooks.Add(1); 
       worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[1]; 
      } 
      catch (Exception e) 
      { 
       throw new Exception(e.ToString()); 
      } 

      worksheet.Cells[5,1] = "hello World"; 
      workSheet_range = worksheet.get_Range("B5", "Q5"); 
      workSheet_range.Merge(14); 
      string b = "YELLOW"; 
      switch (b) 
      { 
       case "YELLOW": 
        workSheet_range.Interior.Color = System.Drawing.Color.Yellow.ToArgb(); 
        break; 
       case "GRAY": 
        workSheet_range.Interior.Color = System.Drawing.Color.Gray.ToArgb(); 
        break; 
       case "GAINSBORO": 
        workSheet_range.Interior.Color = 
      System.Drawing.Color.Gainsboro.ToArgb(); 
        break; 
       case "Turquoise": 
        workSheet_range.Interior.Color = 
      System.Drawing.Color.Turquoise.ToArgb(); 
        break; 
       case "PeachPuff": 
        workSheet_range.Interior.Color = 
      System.Drawing.Color.PeachPuff.ToArgb(); 
        break; 
       default: 
        // workSheet_range.Interior.Color = System.Drawing.Color..ToArgb(); 
        break; 
      } 

      workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb(); 
      workSheet_range.Font.Bold = true; 
      workSheet_range.ColumnWidth = 14; 
      string fcolor = "n"; 
      if (fcolor.Equals("")) 
      { 
       workSheet_range.Font.Color = System.Drawing.Color.White.ToArgb(); 
      } 
      else 
      { 
       workSheet_range.Font.Color = System.Drawing.Color.Black.ToArgb(); 
      } 

      worksheet.Cells[7,2] = "hi"; 
      workSheet_range = worksheet.get_Range("B7", "C7"); 
      workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb(); 
      workSheet_range.NumberFormat = "#,##0"; 

     } 
+0

從ASP.NET或其他服務器技術中使用Office Interop是一個可怕的想法。這些API被編寫用於桌面應用程序,用於自動化Office(一套桌面應用程序)。服務器應用程序在許多方面有所不同,因此在其中使用Office Interop是非常非常糟糕的主意。它也不受Microsoft的支持,並可能違反您的Office許可證。請參閱[服務器端自動化辦公室的注意事項](http://support.microsoft.com/kb/257757) –

+0

此外,擺脫該try/catch塊。除了弄亂堆棧跟蹤並導致混淆以外,它對你沒有任何幫助。你用作參數的'e.ToString()'將成爲新異常的'Message'屬性,這也不是你想要的。完全擺脫try/catch。 –

回答

2

你的代碼執行在主機系統上,並在部署到SharePoint網站的主機系統需要有Excel中安裝並啓用安全訪問來運行它。該解決方案不會擴展或工作正常,因爲您將嘗試從Web服務器線程嘗試多線程訪問。

您需要遵循不同的設計模式,例如使用OpenXml(在客戶端或服務器上)或與Office365 API交互,因爲它在雲中。

API's for Excel Services on the Web