如何从WCF服务调用Excel.Application.Workbooks.Open失败?

时间:2013-11-25 16:35:32

标签: c# .net excel wcf

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

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

不幸的是,Aspose遇到了几个计算错误。为了克服这些问题,作为临时修复,我保存了当前电子表格的临时副本。然后,我使用Microsoft Excel .Net库 - Microsoft.Office.Interop.Excel打开电子表格(强制重新计算)。然后我使用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();

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

1 个答案:

答案 0 :(得分:1)

使用Microsoft.Office.Interop.Excel打开文件时,假定在生成该进程的系统上安装了Office。但是,interop dll将生成一个单独的Excel进程,您可以使用任务管理器进行识别。此Excel进程是在后台运行的实际桌面软件(它也可以编码为在forground中运行)。因此,如果您在服务器上安装了Excel,则从IIS中生成单独的进程很可能是罪魁祸首。话虽如此,应该避免这样做。在服务器上运行Office自动化最好是一个脆弱的解决方案,因为Excel进程的错误可能导致僵尸进程或更糟。微软主张反对这一点。

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