【问题标题】:Advice on which Excel addin development system to use? [closed]关于使用哪个 Excel 插件开发系统的建议? [关闭]
【发布时间】:2020-07-15 09:11:52
【问题描述】:

大约 15 年前,我正在使用 C-API 为 Excel 编写 .xll 插件,主要用于电子表格公式(复杂且耗时的计算),并使用 C++(非常喜欢我的首选语言)编写。我随后用 C# 包装器做了一些事情。

在 Excel 和 Visual Studio 快速发展的长时间休息之后,我再次考虑构建一个插件以使用已编译的代码进行长时间的优化,而不是使用 VBA 脚本。优化涉及从工作表中取出大量数据,然后进行处理,然后将结果写回工作簿(因为我想稍后将它们绘制成图表等)。

注意。这是我自己使用的,我不打算分发任何解决方案

在伪 Excel VBA 代码中,我想要的是这样的:

Dim obj as MyOptimizer
Dim rngInputData as Range

obj.SetData(rngInputData)
obj.Optimize

Dim v as vOutputData
v = obj.GetResult

我对可用的选项有点困惑(没有特别的顺序):

  • 使用 VBA xla 包装器编写 C 样式的 dll
  • 使用 Excel.DNA C# 包装器编写 C 样式的 dll
  • 编写某种 COM 对象(虽然我不确定要使用 Visual Studio 模板)
  • 别的东西...

COM 对象有它的吸引力,因为它会保持状态,我可以创建我的对象的实例,而无需编写笨重的句柄传递系统。另一个考虑因素是不同层之间的编组数量(我将使用很多二维数组,尽管只有双精度数组),以及输入的类型检查。

我正在这个十字路口寻找一些指导,在我进入一种特定方法的兔子洞之前......当然,我会带着更多问题回来!

谢谢!

【问题讨论】:

    标签: excel-addins


    【解决方案1】:

    如果 C++ 仍然是您的首选语言,您当然应该考虑这一点。它将提供可能的最佳性能,并利用您对 C API 的了解。如果您负担得起,我还建议您查看XLL+ library。虽然价格昂贵,但我认为如果您查看这些功能,您会发现它带来了很多价值。

    我开发 Excel-DNA 并且非常喜欢避免使用 C++ 来支持 .NET 平台。 因此,虽然有偏见,但我认为它会更适合您的要求。与 C++ 相比,它是一个更容易工作的环境(在我看来 - 没有 XLOPERs!)但是,编组中有一些开销,因此您会对性能有所妥协。您没有说明您希望交换发生的范围大小或速度。使用 Excel-DNA,我希望您可以在大约一秒钟内轻松读取、处理和写入包含一百万个数字的块(请参阅我的答案:https://stackoverflow.com/a/3868370/44264)。类似地,一个由 10 个带有数字的单元组成的小块在一秒钟内可以被读取和写入超过 10,000 次。如果您使用的是长字符串而不是数字,事情会变得有点慢,但您建议不是这种情况。

    虽然您应该期望计算代码(除了 Excel 互操作)在使用 C# 和 .NET 时会非常快,但您也可以非常高效地与 .NET 中的 C 库对话。因此,在 C 中使用核心计算库并使用 P/Invoke 机制从 .NET 与它们进行交互是一个完全可行的计划,并且您仍然可以从 Excel 部分更愉快的环境中获得(很大)好处。

    使用 Excel 读取/写入的 VBA 和 COM 方法的性能不如 Excel-DNA / .NET 方法(后者也使用 C API 来处理这类事情,而不是 COM)。不过,如果使用得当,COM 开销并不可怕,而且它本身可能不会对您造成影响。

    我本人对这种优化方法很感兴趣,因此如果您采用 Excel-DNA 方法,我很乐意为您提供帮助。 Excel-DNA 问题的最佳位置是Excel-DNA Google group

    开始使用 Excel-DNA 如下所示:

    • 下载并安装(免费)Visual Studio 2019 社区版
    • 安装时选择Desktop .NET Development 工作负载。安装 Excel-DNA 加载项时无需检查 Office 选项。
    • 然后创建一个新的 C#“类库 (.NET Framework)”项目。在这一步不要选择“.NET Standard”或“.NET Core”(长话短说......),这一点很重要。
    • 然后在您的项目中安装来自 NuGet 的“ExcelDna.AddIn”包。
    • 阅读并按照弹出的自述文件中的说明进行操作。
    • 从此处粘贴代码 sn-p:https://stackoverflow.com/a/3868370/44264 按 F5 并在 Excel 中测试。

    在缓慢的 Visual Studio 安装后,只需几分钟,您就会对所涉及的内容有所了解。

    【讨论】:

    • 非常感谢 Govert 的完整回答和建议。更具体地说,我的优化有几个数组的输入,每个数组都有大约一百万个项目。 H
    • (抱歉评论被截断了)。通过 COM 接口传递对象的能力对我很有吸引力,它具有内置的引用计数。使用 CComSafeArray 解包传递的数组非常轻松。如果我想编写电子表格函数,我会选择 Excel.DNA 路线(因为编组速度更重要)。
    猜你喜欢
    • 2010-12-09
    • 2011-11-03
    • 2019-11-30
    • 2019-03-22
    • 1970-01-01
    • 2021-09-01
    • 2011-02-24
    • 2014-08-18
    • 2011-07-16
    相关资源
    最近更新 更多