为什么段落对象访问速度如此之慢?

时间:2017-05-30 04:44:52

标签: vb.net vba ms-word vsto

我正在构建自己的VSTO来替换Word中的标准交叉引用功能。它工作得很好,但是我访问了段落对象的outlineLevel属性。我使用outlineLevel格式化数据网格视图中的可引用项,该视图是自定义任务窗格的一部分。 Word没有正确地勾勒出他们自己的交叉引用面板中的编号项目,我开始怀疑为什么......每次调用paragraph.outlineLevel属性都需要大约。 0.05秒但Winword.exe上的CPU负载仅为5-10%。

为什么需要这么长时间,如何改进代码以检索大纲级别?

我的代码通过扫描文档中的所有段落来构建标题和编号项目列表(与Word自己的分隔列表形成对比的合并列表),检查GetCrossReferenceItems以构建可插入引用列表。

除了调用.Paragraphs.OutlineLevel这个代码很快,扫描一个40页的合同文档来构建一个列表(400个可引用的项目)并在自定义的窗格中显示它需要2-3秒,直到我添加调用.Paragraphs.OutlineLevel,然后根据文档内容激活10-20秒。

奇怪的是我有一个更大的文档(2x大小),对.Parapgraphs.OutlineLevel的调用多10%,但速度提高了4倍! (2s vs 8s)。区别在于大文档有95%编号项目和5%标题,而较小文档比例约为60/40。

代码摘录:

For each para in In Globals.ThisAddIn.Application.ActiveDocument.Paragraphs
    with para.Range

        ' This part is quick -> it does 400 paragraphs in under 0.5s
        ' Collect .text, .ListFormat.ListString, ListNumber, listLevel etc 
        ' Store in own array, array of type, redimmed based on paragraphs.count before I enter the for loop
        ....
        my_paras(paras_found).number = .ListFormat.ListString
        my_paras(paras_found).listLevel = .ListFormat.ListLevelNumber
        my_paras(paras_found).referenceText = aReferences(refCount).number + " " + Trim(Left(.Text, Len(.Text) - 1))
        ....

       ' The listlevel is a pretty accurate reflection of the outline level, 
       ' except for numbered lists of level 1 
       ' get the outline level for the paragraphs of list level 1

       ' This line is a performance killer, for 150 items in my_paras 
       ' it takes 8 seconds
       if my_paras(paras_found).listLevel = 1 then my_paras(paras_found).outlinelevel = .Paragraphs.OutlineLevel

        paras_found = paras_found + 1

    end with
next

0 个答案:

没有答案