大约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
可用的选项让我有些困惑(不分先后):
COM对象具有保持状态的吸引力,因此我可以创建对象的实例,而不必编写笨拙的句柄传递系统。另一个考虑因素是不同层之间的编组数量(我将使用很多2-D数组,尽管只有两倍),以及输入的类型检查。
我正在寻找这个十字路口的指导,然后再尝试一种特定方法的兔子洞……然后,我当然会提出更多问题!
谢谢!
答案 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之后,只需几分钟,您将了解其中涉及的内容。