2012-03-02 96 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

相关问题