使用Microsoft Interop读取和写入excel单元格

时间:2012-03-02 08:34:59

标签: c# asp.net excel interop office-automation

我在部署了我的网站的Web服务器上有一个excel文件。在这个场景中,我有一个屏幕,允许用户从Web服务器下载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();

}

2 个答案:

答案 0 :(得分:3)

您无法从服务器进程安全地使用Office Automation。请参阅Editing an Excel document with Macros in ASP.NET的答案,了解您必须走多远才能确保安全。请参阅ASP.NET Web Service using office 2010 COM,了解如果您尝试从ASP.NET调用它会发生什么。

简而言之,问题在于Office Automation是为桌面应用程序的Microsoft Office产品的桌面应用程序自动化而设计的。当您从服务器应用程序中使用它们时,各种各样的东西都无法正常工作。

答案 1 :(得分:1)

您是否可以远程桌面访问此服务器?

您需要设置导出Excel文件的文件夹的权限,以及在DCOMCNFG中设置权限,以便AppPool用户可以自动执行Excel。 (启动,运行,DCOMCNFG,组件服务,计算机,DCOM配置,然后右键单击Microsoft Excel对象。

您是否考虑过Excel编写器?例如EPPlus