我正在构建自己的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