Office.js Excel:使用格式编写行时提高性能

时间:2018-08-07 21:28:16

标签: office-js excel-2016

我可以在0.3秒内写出25000行x 3列纯文本,这太棒了。

但是,一旦我添加的内容超过纯文本(格式,公式,单元格颜色,条件格式,columnWidth调整等),则需要花费更长的时间。

例如,我用range.getCell(i, 0).format.fill.color = 'yellow'编写了相同的25000行(x 1列),即使使用suspendApiCalculationUntilNextSync()也花了31.223秒。

在将行格式化为Excel时如何获得更好的写入性能?

2 个答案:

答案 0 :(得分:3)

从两个角度回答这个问题。

首先,长期

  1. 首先,我们正在研究制作一个API(尚无ETA,但正在积极研究它的 ),该API应该可以将2D格式的数组输入Range(与您现在可以使用“ .values”,而不必分别创建范围并一次仅设置一个单元格。如果您有一个矩形的单元格块并且想要同时在其上设置一堆格式,那应该会更快。
  2. 如果您的单元格分散在网格中,但是在概念上将它们分组,以使其中一些共享相同的颜色/格式,那么另一个即将发布的API将允许您创建多区域范围,还可以加快处理速度。如果内存来自VBA / VSTO,则最佳点是创建一个由30个左右范围组成的多区域范围对象(例如,“ A1,B7:B9,C11,A4,...”),并设置其格式一气呵成。这也应该有所帮助。

现在,使用短期解决方法:如果您引用的是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'