我正在处理一些大型电子表格(约30,000行)并遇到一些性能问题,并且遇到以下与性能相关的问题:
我可以或者更好,我可以加入一个Excel.run
函数?我需要考虑哪些事项来确定何时将问题分解为多个Excel.run
电话?
一般情况下,我应该在一次通话中创建多少个范围?
在我需要将一个大范围分成多个较小范围之前,我应该使用多大的范围?
调用await ctx.sync()
或多或少会经常做些什么来帮助解决这个问题?
修改
这个问题的动机是:https://stackoverflow.com/a/44424045/3806701
答案 0 :(得分:2)
抱歉没有早点回到这个帖子。
几点意见:
如果您正在操作大量范围(范围很特殊),您肯定希望在尽可能大的块中执行它们(例如,将值设置为一个巨大的数组在单个范围内,而不是逐个单元格设置值并创建一堆Range对象)。 任何新API对象的创建并不便宜,但Excel范围特别并不便宜。团队目前正在调查一些性能问题,一旦我们完成调查,我应该能够分享更多。
就内部实现而言,您可以将Excel.run
视为任务容器(可能类似于C#中的"using"
语句)?特别是Ranges,如果你超过几千(你可以通过实验尝试),事情确实开始大幅放缓。因此,从这个角度来看,您确实希望尽快发布Excel.run
(不要等待用户输入10分钟),并且 - 直到我们有一个解决方法调查我上面提到过 - 你可能希望保持Excel.run
- s相当小,以减少内存占用。
话虽如此,除非您在1000个API对象上创建1000个,否则在正常情况下每个" context.sync"或者" Excel.run"是一个过程边界或网络往返。因此从这个角度来看,将上下文传递给辅助函数比在Excel.run-s上有几个不同的等待它们更好。
有关更多信息,我建议您阅读Building Office Add-ins using Office.js,这是Yours Truly的一本书(但是所有的利润都归功于慈善事业,因此当我向人们推荐时,我不必感到内疚: - ))。如果你很好奇,内部实现有一个很长的(11页)部分,特别是对于Ranges,你可能会发现它很有意思&#34; 一个特殊的(但很常见的)情况:没有ID的对象< / EM>&#34 ;.您还可以在&#34; 上找到更复杂的context.sync示例&#34;非常有用,特别是围绕我的规定模式进行&#34; 跨多个子程序分割工作&#34;
希望这有帮助!