我可以在0.3秒内写出25000行x 3列纯文本,这太棒了。
但是,一旦我添加的内容超过纯文本(格式,公式,单元格颜色,条件格式,columnWidth调整等),则需要花费更长的时间。
例如,我用range.getCell(i, 0).format.fill.color = 'yellow'
编写了相同的25000行(x 1列),即使使用suspendApiCalculationUntilNextSync()
也花了31.223秒。
在将行格式化为Excel时如何获得更好的写入性能?
答案 0 :(得分:3)
从两个角度回答这个问题。
首先,长期
现在,使用短期解决方法:如果您引用的是CDN,并且使用的是较新版本的Office(可能只需“当前频道”就足够了),那么您应该能够通过配置不需要的范围来看到巨大的进步。
首先要有一些背景知识。当您执行Excel.run(...)
时,将在run
的持续时间内跟踪您在该回调中使用的任何范围,以便在添加/删除新行/列时可以对其进行调整。此过程会占用内存,尽管在大多数情况下它是无法感知的,但是如果您创建1000个Ranges,它将大大降低Excel的速度。使用格式化时,如果您要分别将不同的单元格格式化为不同的颜色,并且起始范围足够大,则很可能会达到1000。此外,这包括您创建的 any 范围,甚至包括中间范围(例如,如果您执行var rangeXYZ = originalRange.getCell(0,0).getResizedRange(1,1).getIntersection(somethingElse)
,不仅将创建rangeXYZ
范围,而且还将拥有创建了两个无名的中间范围,一个用于originalRange.getCell(0,0)
,另一个用于调整大小的范围,即使您再也不会访问它们,这些范围仍将在Excel.run
的整个过程中持续存在! ,好消息是最后,在Excel.run
完成后,我们确实会垃圾收集所有这些未使用的范围,但是您的代码在{{1 }},这正是您的问题所在。
所以:正如我所提到的,从较新的版本开始(对较旧的版本不进行操作),您可以在Range上调用Excel.run
来表示您不需要长期跟踪。为了方便起见,对“ .untrack()”的调用将返回对象本身,以便您可以按以下方式进行链接:
.untrack()
请注意每个中间范围以及“ rangeXYZ”本身上的var rangeXYZ = originalRange
.getCell(0,0).untrack()
.getResizedRange(1,1).untrack()
.getIntersection(somethingElse).untrack();
rangeXYZ.format.fill.color = "yellow"
。在处理.untrack()
的过程中,将标记为取消跟踪的任何范围。您仍然可以继续使用范围之前 context.sync()
,但是尝试在context.sync()
之后使用范围会引发错误。本质上,请考虑将context.sync()
标记为下一个untrack()
上的早期垃圾回收对象。
您的行驶里程会有所不同,但是在我使用的示例中,在格式化100x100单元格范围时,性能从13.7秒提高到5.7秒,即性能提高了2.5倍。您可以在此处查看代码差异:{ {3}}。如您所见,可以很容易地撒入context.sync()
调用中,并且可以显着改善。
最好!
〜迈克尔
答案 1 :(得分:1)
尝试为尽可能多的单元格创建一个范围,然后一次调用以下代码:
range.format.fill.color = 'yellow'
如果您无法创建较大的连续范围,请尝试在一个context.sync()
range.format.fill.color='yellow'