【问题标题】:best way to programmatically modify excel spreadsheets以编程方式修改 Excel 电子表格的最佳方法
【发布时间】:2009-09-18 23:32:17
【问题描述】:

我正在寻找一个允许我以编程方式修改 Excel 文件以将数据添加到某些单元格的库。我目前的想法是使用命名范围来确定插入新数据的位置(基本上是 1x1 的范围),然后更新命名范围以指向数据。将与之集成的现有应用程序完全用 C++ 编写,因此我理想情况下正在寻找 C++ 解决方案(因此this thread 的用处有限)。如果一切都失败了,如果有某种方法可以将它与我们的 C++ 应用程序链接起来,我将使用 .NET 解决方案。

理想的解决方案是开源,但我目前看到的解决方案(MyXls 和XLSSTREAM)似乎都无法应对挑战。我喜欢Aspose.Cells 的外观,但它适用于.NET 或Java,而不是C++(而且要花钱)。我需要支持从 97 到现在的所有 Excel 格式,包括 XLSX 和 XLSB 格式。理想情况下,它还支持 OpenOffice 和(用于输出)PDF 和 HTML 等格式。

我需要支持的一些用例:

  • 读取和修改电子表格中的任何单元格,包括公式
  • 创建、读取、修改命名范围(范围本身,而不仅仅是单元格)
  • 将格式从一个单元格复制到一组其他单元格(包括条件格式) - 我们将使用一个单元格作为我们填充数据的所有其他单元格的模板。

如果您能帮我找到合适的库,那就太好了。我还想听听一些关于各种建议(包括我的帖子中的建议)的推荐,以便我做出更明智的决定——什么是易于使用、无错误、便宜等?

【问题讨论】:

    标签: c++ excel


    【解决方案1】:

    最安全的建议是只使用 OLE。它使用 COM,根本不需要 .NET。

    http://en.wikipedia.org/wiki/OLE_Automation

    您可能必须将一些功能包装到函数中以提高可用性,但使用起来确实不难看。

    编辑:请注意,您需要一份 Excel 副本才能使用它。此外,您还可以找到一些特定于 excel 的第一方 .h 文件。 (在维基百科文章中都有解释)

    【讨论】:

      【解决方案2】:

      我不知道这是否适合您,但新的 office 2007 格式是压缩的 XML 格式,这使得您自己进行修改非常可行。见here for the specifications。

      【讨论】:

        【解决方案3】:

        SpreadsheetGear for .NET 将处理您的要求,并具有与 Excel 非常相似的 API。

        当您插入单元格时,您定义的名称(以及任何其他公式/图表/等)将自动修复以引用新范围(就像在 Excel 中一样)。因此,您不需要更新定义的名称(尽管如果您想要这样做,则完全支持创建和更新定义的名称)。

        SpreadsheetGear 是一个 .NET 组件,但您可以构建自己的可从 C++ 调用的包装器。

        您可以see what our customers say 并下载免费、功能齐全的评估版here。

        【讨论】:

          【解决方案4】:

          您是否已经尝试过使用 Excel COM 接口?显然需要在机器上安装Excel,而且处理起来很痛苦......

          【讨论】:

            【解决方案5】:

            我认为带有 COM 互操作的 .net 解决方案用于链接到您的 C++ 应用程序是最好的解决方案。在与他们合作的十多年中,我从未见过没有在某处泄漏内存的 Excel 的 COM 自动化。

            如果您需要自动化 Excel,我推荐Visual Studio Tools for Office。如果您不需要自动化,只修改文件并且这些文件可以是 Office 2007 格式,那么您最好找到一个可以直接操作文件的库,而不是打开 Excel 来进行操作。

            【讨论】:

              【解决方案6】:

              我最终使用了我在原始帖子中提到的 Aspose.Cells,因为它似乎是最简单的路径。我对结果非常满意,他们的支持非常好。我必须在 C# 中围绕它创建一个包装器,将 COM 接口导出到我的 C++ 应用程序。

              【讨论】:

                猜你喜欢
                • 2014-02-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-11-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-05-18
                相关资源
                最近更新 更多