2015-11-30 78 views
1

我正在嘗試使用OpenXML SDK和Microsoft頁面上的示例來替換佔位符與Word文檔中的實際內容。使用OpenXML替換DOCX文件中的文本 - 奇怪的內容

它用於按照here所述的方式工作,但是在Word中添加頁眉和頁腳後編輯模板文件後,它停止工作。我不知道爲什麼和一些調試向我展示了這一點:

enter image description here

這是texts在這段代碼內容:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(DocumentFile, true)) 
{ 
    var texts = wordDoc.MainDocumentPart.Document.Body.Descendants<Text>().ToList(); 
} 

因此,我在這裏看到的是,該文件的正文是 「各自爲政」,即使在Word中的內容是這樣的:

enter image description here

有人可以告訴我如何解決這個問題嗎?


我被問到了我想達到的目標。基本上我想用真實內容替換用戶定義的「佔位符」。我想將Word文檔看作模板。佔位符可以是任何東西。在我上面的例子中,他們看起來像{var:Template1},但這只是我玩的東西。它基本上可以是任何字。

因此,例如,如果文檔包含以下內容:

使用名稱USER_NAME

的用戶應該能夠用這個詞來代替USER_NAME佔位符例如,admin,保持格式不變。結果應該是

使用名稱管理

我工作的段落層次,串聯的內容和然後更換該段的內容看到的問題,我擔心我失去了應該保留的格式

請勿使用名稱admin

+1

如果您獲得文本運行,文本運行可以被個別格式化(例如,如果您在段落中強調單個字符),總會有點像這樣。爲什麼不在段落級別獲得文本?例如'Body.Descendants ().' –

+0

@NickDewitt那麼,如果我這樣做,我不會失去其他格式應用於該段落中的其他文本? –

+0

好吧,文本元素仍然在段落內,格式在段落和文本運行級別。如果從段落或文本運行級別獲取節點文本,則無論如何都會丟失它的格式。你想達到什麼目的,例如在提取它們之後,你將如何處理這些元素? –

回答

2

各種東西都可以對文本進行分段運行。最常見的校對標記(顯然就是這種情況,這裏有「squigglies」)或rsid(用於比較文檔和跟蹤誰編輯什麼,何時),以及「後退」書籤Word在背景中設置。如果您在document.xml「part」中查看基礎WordOpenXML(例如,使用Open XML SDK生產力工具),這些變得非常明顯。

它通常有助於去一個元素級別「更高」。在這種情況下,獲取段落後代的列表,並從那裏獲取所有Text後代並連接它們的InnerText。

+0

謝謝。如果我得到整個段落的文本,我不得不用我的關鍵字替換所需的值,然後設置段落的文本,對不對?這不就是說我失去了該段的所有其他格式嗎?我真正想要達到的是當我在Word中使用「搜索和替換」功能時發生的情況。只需替換一些文本,保持其他格式不變。 –

+0

如果您在問題中未提供完整信息,則無法獲得完整答案。什麼關鍵字?什麼格式?你還沒有提到什麼?給我們一個真實的例子。不,沒有簡單的方法使用Open XML來查找/替換Word公開給用戶及其API的方式。在幕後,Word必須處理相同的情況。當你使用Open XML時,你正在工作在更基本的層面上,這意味着更多的工作...... –

+0

我給你所有的信息。我有一個Word文檔,裏面有文本,我想用其他詞替換某些單詞,如Word中的搜索和替換功能。我給出的例子是Word文檔(截圖)的實際內容以及返回文檔文本部分的確切代碼。沒有別的我沒有提到過。我意識到使用OpenXML比VSTO更基礎的事實,但我期望得到更多的抽象... –

1

OpenXML的確實是你的碎片化的文字:

我創建了一個library認爲正是這一點:渲染從JSON值的Word模板。

documenation of docxtemplater

爲什麼要使用這個

DOCX庫是包含一些XML格式的壓縮格式。如果您希望按值系統構建簡單的替換{tag},則它可能已變得複雜,因爲{tag}在內部被分離爲<w:t>{</w:t><w:t>tag</w:t><w:t>}</w:t>。如果你想嵌入循環遍歷一個數組,它將變成一個真正的麻煩。

圖書館基本上會做以下,以保持格式:

如果文字是:

<w:t>Hello</w:t> 
<w:t>{name</w:t> 
<w:t>} !</w:t> 
<w:t>How are you ?</w:t> 

其結果將是:

<w:t>Hello</w:t> 
<w:t>John !</w:t> 
<w:t>How are you ?</w:t> 

你也必須更換標記<w:t xml:space=\"preserve\">以確保如果變量中有任何空格,則該空格不會被刪除。

相關問題