2012-07-24 84 views
3

我使用OpenXML SDK ver 2來操作某些word文檔。這些文檔目前有自定義的XML部分,我想要做的是特別替換部分的XML。OpenXML替換word文檔中特定的customxml部分

我知道我可以做這樣的事情來訪問文檔的customxml部分:

Dim mainStream As New MemoryStream() 
Dim buffer As Byte() = File.ReadAllBytes(Server.MapPath("myfile.docx")) 
mainStream.Write(buffer, 0, buffer.Length) 

Try 
    Using mainDocument As WordprocessingDocument = WordprocessingDocument.Open(mainStream, True) 

    MainDocumentPart mainPart = mainDocument.MainDocumentPart; 
    'collection of custom xml parts 
    Dim parts = mainPart.CustomXmlParts 
    For Each part As CustomXmlPart In parts 
    'how do I replace the xml here?? 
    Next 

但你可以看到我不知道如何更換零件的XML。我的文檔有兩個名爲item1.xml和item2.xml的XML部分。我想在這些部分中替換XML。我知道我可以使用.DeleteParts()刪除現有的XML部分,我可以使用AddCustomXmlPart()創建新的部分,但我不想這樣做。我只是想替換現有部件的XML。

任何人都可以建議我如何做到這一點?任何建議表示讚賞。

謝謝。

編輯哎呀忘了代碼標籤

回答

5

使用CustomXmlPart實例的FeedData()方法來代替 XML的自定義XML部分。 FeedData()方法首先截取零件流,然後將新數據寫入零件流。 因此,您可以使用此方法替換現有自定義xml部分中的XML。

MainDocumentPart mainPart = mainDocument.MainDocumentPart; 

Dim parts = mainPart.CustomXmlParts 

For Each part As CustomXmlPart In parts 

    Dim ms As New MemoryStream 
    Dim xtw As New XmlTextWriter(ms, Encoding.UTF8) 

    ' Create your xml.' 

    xtw.WriteStartDocument() 
    xtw.WriteStartElement("bla") 
    xtw.WriteEndElement() 
    xtw.WriteEndDocument() 
    xtw.Flush() 

    ms.Seek(0, SeekOrigin.Begin) 

    part.FeedData(ms) ' Replace old xml in part stream.' 

    xtw.Close()  

Next 
+0

完美,謝謝,正是我所需要的。 – TheMethod 2012-07-24 19:00:31