2013-04-08 51 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