2011-06-28 52 views
3

我正在通過重寫CustomXMLPart文件來更新word文檔。我基本上遵循本教程:http://blogs.msdn.com/b/brian_jones/archive/2009/01/05/taking-advantage-of-bound-content-controls.aspxCustomXMLPart中的換行

private bool _makeDoc() 
     { 

     var path = HttpContext.Current.Server.MapPath("~/Classes/Word/template.docx"); 
     using (WordprocessingDocument myDoc = WordprocessingDocument.Open(path, true)) 
     { 
      //create new XML string 
      //these values will populate the template word doc 
      string newXML = "<root>"; 
       newXML += "<name>"; 
       newXML += "name goes here"; 
       newXML += "</name>"; 
       newXML += "<bio>"; 
       newXML += "text" + "more text"; 
       newXML += "</bio>"; 
      newXML += "</root>"; 

      MainDocumentPart mainPart = myDoc.MainDocumentPart; 

      //delete old xml part 
      mainPart.DeleteParts<CustomXmlPart>(mainPart.CustomXmlParts); 

      //add new xml part 
      CustomXmlPart customXml = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml); 
      using(StreamWriter ts = new StreamWriter(customXml.GetStream())) 
      { 
       ts.Write(newXML); 
      } 
      myDoc.Close(); 
     } 
     return true; 
    } 

的問題是,我無法弄清楚如何添加「文本」和「更多的文本」之間的換行符。我試過Environment.NewLine,我試過用<w:p><w:r><w:t>標籤包裝它。我似乎無法讓它產生一個有效的docx文件。

任何幫助,將不勝感激。

回答

3

內容控件屬性有一個「允許回車」的選項。打開這個,並使用Environment.NewLine完美工作。

1

據我所知,至少據我所知,爲了獲得回報,我相信你必須將它們分段包裝。所以,你得到的OOXML將看起來像,

<w:p><w:r><w:t>Text</w:t></w:r></w:p> 
<w:p><w:r><w:t>More text</w:t></w:r></w:p> 

至於它不產生有效的OOXML,當你這樣做,你打開OOXML包「document.xml中」,準確地看到了其中的XML是無效的?

編輯:

OOXML SDK 2.0帶有一些驗證工具,你可能會發現有用的。

+0

是否有某種工具來調試Word文檔,或者你只想讓瀏覽器標誌無效件? –

+0

@Cory OOXML SDK 2.0附帶了一些內置的驗證工具,您可能發現比在IE中打開XML更有幫助。我會在我的回覆中添加一個鏈接。 –

+0

謝謝布蘭登。我看了一下XML,但是在document.xml中,它只有數據綁定標籤,所以它不是很有幫助。但是,我確實發現了一個更簡單的答案,我會發布它。 –

0
通過原始的XML

您可以添加:

<w:r> 
    <w:br /> 
    </w:r> 

通過OOXML SDK:

Paragraph paragraph1 = new Paragraph(); 
Run breakRun = new Run(); 
breakRun.Append(new Break()); 
paragraph1.Append(breakRun); 

_document.MainDocumentPart.Document.AppendChild<Paragraph>(paragraph1); 
//where _document is the WordProcessingDocument instance