C# 如何解决从WCF服务调用Excel.Application.Workbooks.Open失败的问题?

C# 如何解决从WCF服务调用Excel.Application.Workbooks.Open失败的问题?,c#,.net,excel,wcf,C#,.net,Excel,Wcf,我想知道您是否有几分钟的时间来阅读我一直在努力解决的WCF问题 我有一个WCF服务,它在后端使用XL电子表格作为计算引擎的一部分。我正在使用一个名为Aspose的基于第三方.Net的组件来访问、操作和检索电子表格中的数据 不幸的是,Aspose遇到了几个计算错误。为了克服这些问题,作为临时修复,我保存了当前电子表格的临时副本。然后,我用Microsoft Excel.Net库Microsoft.Office.Interop.Excel打开电子表格(强制进行recalc)。然后我使用Aspose重

我想知道您是否有几分钟的时间来阅读我一直在努力解决的WCF问题

我有一个WCF服务,它在后端使用XL电子表格作为计算引擎的一部分。我正在使用一个名为Aspose的基于第三方.Net的组件来访问、操作和检索电子表格中的数据

不幸的是,Aspose遇到了几个计算错误。为了克服这些问题,作为临时修复,我保存了当前电子表格的临时副本。然后,我用Microsoft Excel.Net库Microsoft.Office.Interop.Excel打开电子表格(强制进行recalc)。然后我使用Aspose重新打开临时电子表格来收集结果值

由于我一直在本地实现/调试解决方案,因此此修复程序运行良好

当我将服务部署到IS 7.0时,MS.Net Excel库在尝试打开文件时失败

我认为这是部署的IIS服务的某种权限问题

这是失败的代码片段

String fullPath1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "BCBSDiabetesCalculator.xlsm");

// Open to force Excel to perform calculation itself
Microsoft.Office.Interop.Excel.Application excelApp1 = new Microsoft.Office.Interop.Excel.Application();

var excelWorkbook1 = excelApp1.Workbooks.Open(fullPath1); 
打开文件流并将其传递给Aspose库调用时,下面的代码块起作用。

//Get the Excel file into stream
FileStream stream = new FileStream(fileName, FileMode.Open);

//Instantiate LoadOptions specified by the LoadFormat.
LoadOptions loadOptions = new LoadOptions(LoadFormat.Xlsx);

//Create a Workbook object and opening the file from the stream
_workbook = new Workbook(stream, loadOptions);

if (_workbook == null)
{
}

// Make sure that we close the stream.
stream.Close();

您对如何解决此问题有什么见解/想法吗?

当您使用Microsoft.Office.Interop.Excel打开文件时,假定生成此过程的系统上安装了Office。但是,互操作dll将生成一个单独的Excel进程,您可以使用任务管理器识别该进程。此Excel进程是在后台运行的实际桌面软件(也可以将其编码为在上一轮中运行)。因此,如果您在服务器上安装了Excel,那么从IIS中派生一个单独的进程很可能是罪魁祸首。也就是说,应该避免这样做。在服务器上运行Office automation充其量是一个脆弱的解决方案,因为Excel进程中的错误可能导致僵化进程或更糟的情况。微软对此表示反对


如果可能,(这是一个建议,因为我没有使用ASpose),使用。如果将excel文件保存为此格式,并且ASpose可以打开它,则不会生成excel流程实例。如果您必须使用Office进行服务器端工作,并且可以使用OpenXML,这将避免通过interop DLL运行桌面应用程序,并为您节省大量的麻烦。

服务器上是否安装了excel?从ASP.NET或其他服务器技术使用Office interop是一个可怕的想法。这些API是为在桌面应用程序中使用而编写的,用于自动化Office(一套桌面应用程序)。服务器应用程序在许多方面都不同,因此在其中使用Office互操作是一个非常非常糟糕的主意。它也不受Microsoft支持,可能会违反您的Office许可证。看见