2012-07-12 435 views
58

我正在寫一個適用於excel文件的應用程序。 我需要一個功能來刪除工作表。 我必須使用程序集Microsoft.Office.Interop.Excel.dll。如何在未安裝MS Office的計算機上使用Microsoft.Office.Interop.Excel?

它的運行開發機器上很好,但是當我嘗試將其部署到服務器,我得到一個錯誤:

Could not load file or assembly 'office, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies

我明白這個問題時,一臺機器上沒有安裝MS Office的發生。 客戶不想以任何代價在服務器上安裝和購買MS Office。

我在開發者機器上安裝了「Redistributable Primary Interop Assemblies」,如下所示:http://forums.asp.net/t/1530230.aspx/1 並重新編譯我的項目。

代碼示例:

public bool DeleteSheet(string tableName) 
{ 
    Excel.Application app = null; 
    Excel.Workbooks wbks = null; 
    Excel._Workbook _wbk = null; 
    Excel.Sheets shs = null; 

    bool found = false; 

    try 
    { 
     app = new Excel.Application(); 
     app.Visible = false; 
     app.DisplayAlerts = false; 
     app.AlertBeforeOverwriting = false; 

     wbks = app.Workbooks; 
     _wbk = wbks.Add(xlsfile); 
     shs = _wbk.Sheets; 
     int nSheets = shs.Count; 

     for (int i = 1; i <= nSheets; i++) 
     { 
      Excel._Worksheet _iSheet = (Excel._Worksheet)shs.get_Item(i); 
      if (_iSheet.Name == tableName) 
      { 
       _iSheet.Delete(); 
       found = true; 

       Marshal.ReleaseComObject(_iSheet); 
       break; 
      } 
      Marshal.ReleaseComObject(_iSheet); 
     } 

     if (!found) 
      throw new Exception(string.Format("Table \"{0}\" was't found", tableName)); 

     _wbk.SaveAs(connect, _wbk.FileFormat, Missing.Value, Missing.Value, Missing.Value, 
     Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, 
     Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 
    } 
    finally 
    { 
     _wbk.Close(null, null, null); 
     wbks.Close(); 
     app.Quit(); 

     Marshal.ReleaseComObject(shs); 
     Marshal.ReleaseComObject(_wbk); 
     Marshal.ReleaseComObject(wbks); 
     Marshal.ReleaseComObject(app); 
    } 
    return true; 
} 

例外

Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

發生就行

app = new Excel.Application(); 

任何人都可以就如何得到這個功能成功合作建議?

回答

52

如果不安裝ms office,則無法使用Microsoft.Office.Interop.Excel。

在谷歌剛剛尋找一些圖書館,它允許修改XLS或XLSX:

+9

文檔是 - 互操作程序集只是告訴.NET如何調用Excel的COM庫。他們沒有任何功能。另一個流行的閱讀/寫作.xlsx文件:http://closedxml.codeplex.com/ – Govert 2012-07-12 09:12:55

+0

謝謝。 我會嘗試這些庫。 – 2012-07-12 09:40:36

+2

碰巧,您甚至無法在未安裝Office的情況下_BUILD_包含對Microsoft.Office.Core **的引用的項目。其他文檔級別的Interop程序集引用似乎可以編譯但不能運行。我的解決方法是刪除明確的** Microsoft.Office.Core **引用,並用**動態**和** var **關鍵字替換它們,這些關鍵字允許在intellisense完成其開發人員機。 – CZahrobsky 2014-08-08 17:09:41

1

如果「客戶不想安裝和購買MS Office的服務器上沒有任何價格「,那麼你不能使用Excel ......但我無法得到的訣竅:這完全是關於一個基本的辦公室許可證,其成本大約爲150美元......我想這花費一次尋找替代品會花費b遠遠超過這個數量!

+19

在服務器上使用Excel是填充練習。首先:這是一個無用的漏洞。其次,速度非常慢,寫作和閱讀文檔需要很長時間 - 如果您擁有多個用戶,那麼效果會非常好。第三:辦公室不適合完全自動化的使用。有創建messageboxes等highcups這是「不太好」的服務器上...... – 2013-01-02 08:25:00

+0

「秒慢得很,寫作和閱讀文件需要很長時間」 - 不以我的經驗。 另外如果客戶想通過瘦客戶端使用Excel,MS Office或者其他任何軟件,那麼該怎麼辦?它將*在該場景中有*到服務器上。 – 2013-02-20 16:34:54

+17

作爲一名顧問,我會發現告訴客戶他們將不得不在他們的CI服務器上安裝MS Office時感到非常尷尬。關於麻煩和跆拳道因素,這不是關於錢的問題。它可能不只是一臺服務器,也許它們有5,10,20個虛擬CI服務器。那麼我們談論的錢和管理成本超過150美元。 – 2013-07-08 04:08:23

2

您可以創建服務並在服務器上生成excel,然後允許客戶端下載excel。 cos購買excel許可證爲1000 ppl,最好有一個服務器許可證。

希望有幫助。

+1

不建議在客戶服務器體系結構中開發辦公自動化。 – kaushalparik27 2014-09-15 10:41:29

0

尋找GSpread.NET。 您可以使用Microsoft Excel中的API使用Google Spreadsheets。 您不需要用新的Google API用法重寫舊代碼。只需添加幾行:

Set objExcel = CreateObject("GSpreadCOM.Application"); 

app.MailLogon(Name, ClientIdAndSecret, ScriptId); 

這是一個OpenSource項目,它不需要安裝Office。

可以在這裏http://scand.com/products/gspread/index.html

+0

正如我所看到的您發佈的代碼一樣,您必須以某種方式登錄「Google系統」。因此,安裝Office許可證的替代方法已在Google中註冊。我知道這是免費的,但是...我不喜歡讓我的應用程序登錄Google服務的想法。 – EAmez 2017-05-16 09:03:18

相關問題