2013-04-08 47 views
1

编程MS Word时,有什么方法可以列出字符样式发生更改的文本中的点?在Word中查找样式更改

我以编程方式尝试分析段落以检索具有相同样式的文本的所有连续块 - 换句话说,在文本样式更改的点处拆分段落。目前我所采取的方式是将每个角色与前一个角色的风格进行比较 - 如果风格的名称不同,我知道我已经找到了将结果拆分为的点。这种方法很有效,但效率非常低(对于每个角色,您都必须对样式名称进行完整的字符串比较)。我想知道在Word对象模型中是否有一种方法可以在不比较每个字符的情况下解决这个问题?我正在使用的近似代码如下(这是C#代码:我正在使用COM Interop对Word 2003,但我会同样满意VBA中的解决方案,因为一旦我原则上知道如何做到这一点,转换为C#应该很容易。)

// used to store the results as we go 
StringBuilder currentText = new StringBuilder(); 
string currentStyle = null; 

// range contains the Range I want to split up 
foreach (Range charRng in range.Characters) 
{ 
    string style = charRng.get_Style().NameLocal; 
    if (style == currentStyle) 
    { 
     currentText.Append(charRng.Text); 
    } 
    else 
    { 
       AddTextBlockToMyResults(currentStyle, currentText.ToString()); 
     currentText = new StringBuilder(charRng.Text); 
     currentStyle = style; 
    } 
} 
AddTextBlockToMyResults(currentStyle, currentText.ToString()); 

回答

2

什么版本的Office被用来创建Word文档?

如果是Office 2007或更高版本(或者,您可以将文档转换为该格式),那么办公文档实际上只是一个.zip存档。如果你打开一个.docx文件用WinRAR的一样存档工具,你会看到它像一个目录结构:

_rels 
customXml 
docProps 
word 
|_ document.xml 

这document.xml中是一个Open Office XML文件,其中包含所有的文本和参照风格在你的Word文档中。我敢打赌,你可以解析XML比你现在做的要快得多。

+0

狡猾:-)是的,性能明智,将大大提高效率。虽然我需要了解更多的工作,然后编写代码来解析document.xml,所以使用Word对象模型的解决方案会更可取。我会考虑你的想法作为最后的手段。 – PhantomDrummer 2013-04-08 16:23:29

+0

嗯,我明白你对切换路径的默默无闻......但我认为它不会那么糟糕。您不必真正理解完整的XSD或知道所有标签的含义 - 只要您可以选择哪个标签意味着风格发生变化即可。我敢打赌,你可以用一些风格变化来模拟一个虚拟文档,看看Word如何实现它们。那时你只是在寻找你关心的标签,而且可能会忽略其他标签。无论如何祝你好运:-),Office COM层并不是最友好的。 – GojiraDeMonstah 2013-04-08 16:37:03

+0

在看了一些docx格式后,我同意你的看法。 Office COM层给了我无尽的问题(我认为主要是由于缺乏体面的文档),而document.xml文件几乎是自行记录的。反而可能值得努力。 – PhantomDrummer 2013-04-09 09:26:01