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

我在我的网站部署的Web服务器上有一个Excel文件。 该场景,我有一个屏幕,允许用户从Web服务器下载一个Excel文件,并保存到本地驱动器,然后select相同的文件path导出数据。 BT我得到以下错误

ASP.NET无权访问请求的资源。 考虑将资源的访问权限授予ASP.NET请求标识。 ASP.NET具有基本的进程标识(通常是IIS 5上的{MACHINE} \ ASPNET或IIS 6上的networking服务),如果应用程序未模拟,则使用该标识。 如果应用程序正在通过模拟,身份将是匿名用户(通常为IUSR_MACHINENAME)或经过身份validation的请求用户。 要授予对文件的ASP.NET访问权限,请右键单击资源pipe理器中的文件,select“属性”并select“安全”选项卡。 点击“添加”添加适当的用户或组。 突出显示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(); } 

您无法从服务器进程安全地使用Office Automation。 请参阅在ASP.NET中使用“macros”编辑Excel文档的答案,以了解为了安全起见您必须走多远。 请参阅使用Office 2010 COM的ASP.NET Web Service来了解如果您只是尝试从ASP.NET调用它,会发生什么情况。

简而言之,问题在于Office自动化是为台式机应用程序的Microsoft Office产品的桌面应用程序的自动化而devise的。 从服务器应用程序使用它们时,各种各样的东西不能正常工作。

你有远程桌面访问这台服务器?

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

你有没有考虑过一个Excel作家? 如EPPlus 。