【问题标题】:How to use Microsoft.Office.Interop.Excel on a machine without installed MS Office?如何在未安装 MS Office 的机器上使用 Microsoft.Office.Interop.Excel?
【发布时间】:2012-07-12 08:52:15
【问题描述】:

我正在编写一个适用于 excel 文件的应用程序。 我需要一个功能来删除工作表。 我必须使用 Microsoft.Office.Interop.Excel.dll 程序集。

它在开发者机器上运行良好,但是当我尝试在服务器上部署它时出现错误:

无法加载文件或程序集'office,版本=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' 或其之一 依赖关系

我了解当计算机上未安装 MS Office 时会出现问题。 客户不希望不以任何价格在服务器上安装和购买 MS Office。

我按照此处的建议在开发人员机器上安装“可再发行主互操作程序集”: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;
}

异常

检索具有 CLSID 的组件的 COM 类工厂 {00024500-0000-0000-C000-000000000046} 由于以下原因而失败 错误:80040154 类未注册(HRESULT 异常: 0x80040154 (REGDB_E_CLASSNOTREG))。

就行了

app = new Excel.Application();

任何人都可以建议如何使此功能成功运行吗?

【问题讨论】:

标签: c# excel dll interop


【解决方案1】:

如果没有安装 ms office,您将无法使用 Microsoft.Office.Interop.Excel。

只需在谷歌中搜索一些允许修改 xls 或 xlsx 的库:

【讨论】:

  • 是的 - 互操作程序集只是告诉 .NET 如何调用 Excel COM 库。它们没有任何功能。另一种流行的读/写 .xlsx 文件:closedxml.codeplex.com
  • 谢谢。我会试试这些库。
  • 碰巧的是,如果不安装 Office,您甚至无法 BUILD 包含对 Microsoft.Office.Core 的引用的项目。其他文档级互操作程序集引用似乎编译但未运行。我的解决方法是删除显式 Microsoft.Office.Core 引用,并用 dynamicvar 关键字替换它们,这些关键字允许后期引用在智能感知在开发者的机器上完成它的工作之后。
  • 我安装了办公室,但我遇到了同样的问题。你能帮忙吗?
【解决方案2】:

如果“客户不想以任何价格在服务器上安装和购买 MS Office”,那么您就不能使用 Excel ......但我不明白这一点:这都是关于一个基本的 Office 许可证,需要花费150 美元之类的...而且我猜花时间寻找替代品的成本将远远超过这个金额!

【讨论】:

  • 在服务器上使用 Excel 是一种练习。第一:这是一个不必要的漏洞。其次,它非常慢,编写和阅读文档需要很长时间 - 如果您有多个用户,那就太好了... 第三:Office 不适合完全自动化的使用。有些高手正在创建消息框等。这在服务器上“不太好”......
  • “第二个非常慢,写和读文档需要很长时间” - 不是我的经验。此外,如果客户想通过瘦客户端完整使用 Excel、MS Office 或任何其他软件怎么办?在那种情况下,它必须在服务器上运行。
  • 作为顾问,告诉客户他们必须在 CI 服务器上安装 MS Office,我会觉得非常尴尬。与其说是钱,不如说是麻烦和 WTF 因素。而且它可能不仅仅是一台服务器,也许他们有 5,10,20 台虚拟 CI 服务器。然后我们谈论的资金和管理成本超过 150 美元。
  • 我同意@JonasSöderström 的观点,这与考虑单一 Office 许可证无关
【解决方案3】:

您可以在服务器上创建服务并生成 excel,然后允许客户端下载 excel。 因为1000人买了excel许可证,最好有一个服务器许可证。

希望有帮助。

【讨论】:

  • 不建议在客户端服务器架构中开发办公自动化。
  • 每台使用该服务的设备都需要有一个许可证。微软在人们如何使用自己的许可证方面非常灵活。但是,这并不包括购买一个单次使用许可证,然后与其他 +1000 人共享。
【解决方案4】:

寻找 GSpread.NET。 您可以使用 Microsoft Excel 中的 API 来使用 Google 电子表格。 您无需使用新的 Google API 用法重写旧代码。只需添加几行:

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

app.MailLogon(Name, ClientIdAndSecret, ScriptId);

这是一个开源项目,不需要安装 Office。

这里提供的文档http://scand.com/products/gspread/index.html

【讨论】:

  • 我可以看到您发布的代码,您必须以某种方式登录“Google 系统”。因此,安装 Office 许可证的替代方法是在 Google 中注册。我知道它是免费的,但是……我不喜欢让我的应用程序登录 Google 服务的想法。
猜你喜欢
  • 2015-06-05
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
相关资源
最近更新 更多