2010-08-27 46 views
0

this post有關,我一直在大量使用Word的Open XML和可用的庫。大多數人似乎都不知道的是,有一些很好的resources用於編程式地處理Word的Open XML格式(並且我不是指手動將XML寫入文件流!)。開放式XML - 錯誤格式

我的問題是關於我正在做的事情。基本上,我手動創建郵件合併。現在,郵件合併實際上可以正常工作,但是,不能正常工作的是將郵件合併域放在文檔中。這是我在做什麼:

string mergeFieldName = m.Value.Replace("[", string.Empty).Replace("]", string.Empty); 
Body body = new Body(); 
DocumentFormat.OpenXml.Wordprocessing.Paragraph p = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); 
SimpleField simpleField = new SimpleField() { Instruction = " MERGEFIELD " + mergeFieldName + " " }; 
Run run = new Run(); 
RunProperties runProperties = new RunProperties(); 
NoProof noProof = new NoProof(); 
runProperties.Append(noProof); 
Text text = new Text("«" + mergeFieldName + "»"); 
run.Append(runProperties); 
run.Append(text); 
simpleField.Append(run); 
p.Append(simpleField); 
body.Append(p); 

docXml.InnerXml = docXml.InnerXml.Replace(m.Value, body.InnerXml); 

變量m實際上是基於方括號內我的正則表達式匹配一切Match對象。 (你也許會奇怪,爲什麼我這樣做像我 - 這不是在這裏有關)

我的問題是生成的XML是無效的,因爲我有以下幾點:

<w:p w:rsidR="00945DC1" w:rsidRDefault="006878CA"> 
    <w:r> 
    <w:t xml:space="preserve"> 
     <w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
     <w:fldSimple w:instr=" MERGEFIELD FullName "> 
      <w:r> 
      <w:rPr> 
       <w:noProof /> 
      </w:rPr> 
      <w:t>«FullName»</w:t> 
      </w:r> 
     </w:fldSimple> 
     </w:p> 
    </w:t> 
    </w:r> 
</w:p> 

而且這裏有一個例子從手工創建的文檔工作XML:

<w:p w:rsidR="001B2242" w:rsidRDefault="001B2242"> 
    <w:r> 
    <w:tab/> 
    </w:r> 
    <w:fldSimple w:instr=" MERGEFIELD &quot;SalutationName&quot; "> 
    <w:r> 
     <w:rPr> 
     <w:noProof/> 
     </w:rPr> 
     <w:t>«SalutationName»</w:t> 
    </w:r> 
    </w:fldSimple> 
</w:p> 

實際的錯誤,我得到的是「文件無法打開,因爲有問題與內容」。如果我不寫郵件合併領域,加載文檔,然後插入郵件合併領域,它的工作原理。所以實際的郵件合併是正確的,只是郵件合併字段不正確。 (請參閱我的引用文章,瞭解如何獲取郵件合併)。

對此有何意見?

乾杯

回答

0

我看到的是你正在更換它錯誤。你把你正在創建AW裏面的新的XML:T標記是一個文本標籤,如果我沒有記錯的話」

跳過體創作,並與m.Values父母的innerXml取代該段p的InnerXml 。

這就是,如果我正確理解這一點。