簡體   English   中英

從WCF服務調用時,如何解決Excel.Application.Workbooks.Open失敗?

[英]How to resolve Excel.Application.Workbooks.Open failing when called from WCF Service?

我想知道您是否有幾分鍾時間來閱讀我一直在努力解決的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();

您對如何解決此問題有任何見解/想法嗎?

當您使用Microsoft.Office.Interop.Excel打開文件時,這假定Office已安裝在系統上,從而產生了該進程。 但是,互操作dll將生成一個單獨的Excel進程,您可以使用任務管理器進行識別。 此Excel流程是在后台運行的實際桌面軟件(也可以將其編碼為在前台運行)。 因此,如果您確實在服務器上安裝了Excel,則很可能是從IIS內生成單獨的進程。 話雖如此,應該避免這樣做。 在服務器上運行Office自動化充其量是一個脆弱的解決方案,因為Excel進程錯誤可能導致僵屍進程或更糟。 Microsoft反對這樣做。

如果可能的話(這是一個建議,因為我沒有使用過ASpose),請使用OpenXML 如果將excel文件保存為這種格式,並且ASpose可以打開它,則不會生成Excel流程實例。 如果必須與Office一起進行服務器端工作,並且可以使用OpenXML,它將避免通過互操作dll運行桌面應用程序,從而省去了很多麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM