2012-03-02 71 views
1

我的網站上部署了Web服務器上的Excel文件。該場景,我有一個屏幕,允許用戶從Web服務器下載Excel文件並保存到本地驅動器,然後選擇相同的文件路徑導出數據。 BT我得到以下錯誤使用Microsoft Interop讀取和寫入Excel單元格

ASP.NET未被授權訪問請求的資源。考慮將資源的訪問權限授予ASP.NET請求標識。 ASP.NET具有基本的進程標識(通常是IIS 5上的{MACHINE} \ ASPNET或IIS 6上的網絡服務),如果應用程序未模擬,則使用該標識。如果應用程序正在通過模擬,身份將是匿名用戶(通常爲IUSR_MACHINENAME)或經過身份驗證的請求用戶。要授予對文件的ASP.NET訪問權限,請右鍵單擊資源管理器中的文件,選擇「屬性」並選擇「安全」選項卡。點擊「添加」添加適當的用戶或組。突出顯示ASP.NET帳戶,然後選中所需訪問權限的複選框。下面

是我的代碼

private void btnExportToExcel_Click(object sender, System.EventArgs e) 
    { 
     Microsoft.Office.Interop.Excel.ApplicationClass appExcel = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
     DataSet dsResult = new DataSet(); 
     object missingValue = System.Reflection.Missing.Value; 
     decimal wkOpenBal = 0.00m; 
     decimal wkAddition = 0.00m; 
     decimal wkDisposal = 0.00m; 
     string rptDt = ""; 

     decimal os_p = 0.00M; 
     decimal os_s = 0.00M; 
     decimal closs_16_25 = 0.00M; 
     decimal closs_26 = 0.00M; 
     decimal os_clr_p = 0.00M; 
     decimal os_whs_p = 0.00M; 
     decimal os_clr_s = 0.00M; 
     decimal os_whs_s = 0.00M;   
     decimal mark_to_mkt = 0.00M; 
     decimal mark_to_mkt_error = 0.00M; 


     if(txtWeeklyFile.Value != "") 
     { 
      //DATABASE CALL 
      objBursaSubmission = (IBursaSubmission) ObjectFactory.Instance.GetObject(ObjectIdentifier.BursaSubmissionManager);      
      dsResult = objBursaSubmission.GetReportData(txtRptdt.Text); 

      try 
      { 
       if(dsResult != null && dsResult.Tables[0].Rows.Count > 0) 
       { 
        if(System.IO.File.Exists(txtWeeklyFile.Value.ToString())) 
        { 
         wkOpenBal = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["WK_OPENBAL"]); 
         wkAddition = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["WK_ADDITION"]); 
         wkDisposal = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["WK_DISPOSAL"]); 
         rptDt = dsResult.Tables[0].Rows[0]["LOGICAL_DT"].ToString();     

         os_p = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_P"]); 
         os_s = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_S"]); 
         closs_16_25 = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["CLOSS_16_25"]); 
         closs_26 = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["CLOSS_26"]); 
         os_clr_p = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_CLR_P"]); 
         os_whs_p = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_WHS_P"]); 
         os_clr_s = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_CLR_S"]); 
         os_whs_s = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_WHS_S"]); 
         mark_to_mkt = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["MARK_TO_MKT"]); 
         mark_to_mkt_error = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["mark_to_mkt_error"]); 

         decimal clr_total_p = os_clr_p + os_whs_p; 
         decimal clr_total_s = os_clr_s + os_whs_s; 

         Microsoft.Office.Interop.Excel.Workbook wBook = appExcel.Workbooks.Open(txtWeeklyFile.Value.ToString(),Type.Missing,Type.Missing,Type.Missing, 
          Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing, 
          Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing); 

         //SHEET MARKET POSITION SHEET 1                
         Worksheet sheetMarktetPosition1 = (Worksheet)wBook.Sheets[1];      
         Range mPositionRange = sheetMarktetPosition1.UsedRange;     

         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[6,7]).Value2 = rptDt.ToString(); 

         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[14,3]).Value2 = os_p.ToString(); 
         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[14,7]).Value2 = mark_to_mkt.ToString();       
         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[16,3]).Value2 = os_s.ToString();        
         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[15,5]).Value2 = ""; 
         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[40,3]).Value2 = clr_total_p.ToString(); 
         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[41,3]).Value2 = clr_total_s.ToString(); 

} 
+3

http://support.microsoft.com/kb/257757 Microsoft目前不推薦並不支持從任何無人蔘與的非交互式客戶端應用程序或組件(包括ASP,ASP.NET)自動化Microsoft Office應用程序,DCOM和NT服務),因爲Office在此環境中運行時可能會出現不穩定的行爲和/或死鎖。 – 2012-03-02 09:07:53

回答

3

你不能安全地從使用辦公自動化服務器進程,請參閱Editing an Excel document with Macros in ASP.NET的答案,以瞭解您需要多長時間才能使其安全。請參閱ASP.NET Web Service using office 2010 COM以瞭解如果您只是嘗試從ASP.NET調用它會發生什麼情況。辦公自動化是爲桌面應用程序的自動化而設計的,它是桌面應用程序的Microsoft Office產品當從服務器應用程序使用它們時,事情無法正常工作。

+0

正確的約翰,早些時候它是客戶端與ActiveX控件的幫助,但我們的客戶再次禁用所有用戶終端上的ActiveX控件。所以我們決定轉移到服務器端。 現在我們必須保持它在服務器端並提供許可。並且它的一個intranet應用程序有4個用戶正在使用這個應用程序,他們還沒有準備好在IE上啓用activex控件 任何想法如何讓當前的服務器端代碼啓動並運行? 謝謝 – SeeSharp 2012-03-02 09:28:31

+2

「啓動並運行」是不可能的。使用Office Automation服務器端的想法從根本上被打破。唯一的例外是如果您遵循http://stackoverflow.com/a/9493163/76337的模式。請注意,他的代碼如此複雜是一個很好的理由 - 通過使用辦公自動化以其設計方式以外的方式「欺騙大自然」是一件非常糟糕的事情。 – 2012-03-02 09:31:54

1

你有這個服務器的遠程桌面訪問?

您需要設置Excel文件導出到的文件夾的權限,以及在DCOMCNFG中設置權限,以便AppPool用戶可以自動執行Excel。 (開始,運行,DCOMCNFG,組件服務,計算機,DCOM配置,右單擊Microsoft Excel對象。

你有沒有考慮一個Excel的作家呢?比如EPPlus

+0

謝謝Makit 不,我沒有遠程桌面訪問。因爲我的客戶不提供服務器訪問供應商員工。 只要權限問題,有多個用戶將使用相同的屏幕。現在的問題是我的代碼是服務器端和客戶端機器上的文件,我發佈在我的文章中。我如何在服務器上設置權限策略,以便用戶將數據導出爲ex​​cel文件時,我的應用程序dosent會拋出任何錯誤? 任何幫助 謝謝 – SeeSharp 2012-03-02 09:14:49

+0

從故障排除的角度來看,它的響應良好。 +1,即使所得到的解決方法不利。 – 2014-09-15 05:00:33

相關問題