2012-07-12 436 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

相关问题