有关使用哪种Excel插件开发系统的建议?

时间:2020-07-15 09:11:52

标签: excel-addins

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

经过一段很长的休息后,在此期间Excel和Visual Studio迅速发展,我再次考虑构建一个外接程序,以使用编译后的代码进行冗长的优化,而不是使用VBA脚本。优化涉及从工作表中取出大量数据,然后进行运算,然后将结果写回到工作簿中(如我以后要绘制的图表等)。

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

在伪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对象具有保持状态的吸引力,因此我可以创建对象的实例,而不必编写笨拙的句柄传递系统。另一个考虑因素是不同层之间的编组数量(我将使用很多2-D数组,尽管只有两倍),以及输入的类型检查。

我正在寻找这个十字路口的指导,然后再尝试一种特定方法的兔子洞……然后,我当然会提出更多问题!

谢谢!

1 个答案:

答案 0 :(得分:1)

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

我开发Excel-DNA,非常喜欢避免使用C ++来支持.NET平台。 因此,尽管有偏见,但我认为它会更适合您的要求。与C ++相比,它的工作环境要容易得多(我认为-没有XLOPER!)。但是,封送处理存在一些开销,因此您会在性能上有所妥协。您没有说明希望进行交换的范围大小或速度。借助Excel-DNA,我希望您可以在大约一秒钟内轻松地读取,处理和编写一百万个数字的块(请在此处查看我的答案:https://stackoverflow.com/a/3868370/44264)。类似地,一小块10个带有数字的单元可以在一秒钟内读写10,000次以上。如果您使用长字符串而不是数字,事情会变慢一些,但您建议事实并非如此。

尽管您期望C#和.NET的计算代码(除Excel互操作之外)非常快,但您也可以非常高效地与.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”包。
  • 阅读并遵循弹出的自述文件中的说明。
  • 从此处粘贴代码段:https://stackoverflow.com/a/3868370/44264按F5键并在Excel中进行测试。

在缓慢安装Visual Studio之后,只需几分钟,您将了解其中涉及的内容。

相关问题