2011-12-23 69 views
5

我想在.docx文件中創建AddAlternativeFormatImportPart以便通過AltChunk在文檔中引用它。問題是下面的代碼導致docx文件被Word讀取爲損壞,無法打開。使用OpenXml調用AddAlternativeFormatImportPart後損壞的文檔

 string html = "some html code." 

     string altChunkId = "html234"; 
     var document = WordprocessingDocument.Open(inMemoryPackage, true); 
     var mainPart = document.MainDocumentPart.Document; 
     var mainDocumentPart = document.MainDocumentPart; 

     AlternativeFormatImportPart chunk = mainDocumentPart.AddAlternativeFormatImportPart 
      (AlternativeFormatImportPartType.Xhtml, altChunkId); 

     Stream contentStream = chunk.GetStream(FileMode.Open,FileAccess.ReadWrite); 
     StreamWriter contentWriter = new StreamWriter(contentStream); 
     contentWriter.Write(html); 
     contentWriter.Flush(); 

     { 
      ... 
     } 

     mainPart.Save(); 

回答

7

我想這可能是你如何處理來自AlternativeFormatImportPart的流。嘗試使用FeedData,而不是像下面的例子。

 StringBuilder xhtmlBuilder = new StringBuilder(); 
     xhtmlBuilder.Append("<html>"); 
     xhtmlBuilder.Append("<body>"); 
     xhtmlBuilder.Append("<b>Hello world!</b>"); 
     xhtmlBuilder.Append("</body>"); 
     xhtmlBuilder.Append("</html>"); 

     using (WordprocessingDocument doc = WordprocessingDocument.Open(inputFilePath, true)) 
     { 
      string altChunkId = "chunk1"; 
      AlternativeFormatImportPart chunk = doc.MainDocumentPart.AddAlternativeFormatImportPart 
       (AlternativeFormatImportPartType.Xhtml, altChunkId); 

      using (MemoryStream xhtmlStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xhtmlBuilder.ToString()))) 
      { 
       chunk.FeedData(xhtmlStream); 

       AltChunk altChunk = new AltChunk(); 
       altChunk.Id = altChunkId; 
       doc.MainDocumentPart.Document.Body.Append(altChunk); 
      } 

      doc.MainDocumentPart.Document.Save(); 

     } 
+0

:您的回答非常有用。您可以給我一個提示,以解決我的問題...而不是將html數據提供給word文檔,我想獲取相應html數據的OOXML格式化字符串。無需更新單詞document.i只需要ooxml格式化的字符串... – Saravanan 2013-03-20 11:08:53

3

我認爲這是因爲您無法將AltChunk導入從內存流打開的文檔中。我遇到過同樣的問題。我是從內存流打開該模板,像這樣:

Private Sub UpdateDoc(templatePath As String) 
    Using fs As FileStream = File.OpenRead(templatePath) 
     Using ms As New MemoryStream 
      CopyStream(fs, ms) 
      Using doc As WordprocessingDocument = WordprocessingDocument.Open(ms, True) 
       'update the document 
       doc.MainDocumentPart.Document.Save() 
      End Using 
     End Using 
    End Using 
End Sub 

Private Sub CopyStream(source As Stream, target As Stream) 
    Dim buffer() As Byte 
    Dim bytesRead As Integer = 1 

    ReDim buffer(32768) 

    While bytesRead > 0 
     bytesRead = 0 
     bytesRead = source.Read(buffer, 0, buffer.Length) 
     target.Write(buffer, 0, bytesRead) 
    End While 
End Sub 

本工程爲內容控制等的正常更新,並源源不斷地送回客戶端或保存爲DOCX文檔時是好的。但插入AltChunk時會破壞文檔。

從一個物理文件路徑打開文檔工作插入AltChunk當像這樣:

Using doc As WordprocessingDocument = WordprocessingDocument.Open(strTempFile, True) 
     Dim altChunkId As String = "AltChunkId1" 
     Dim mainDocPart As MainDocumentPart = doc.MainDocumentPart 

     Dim chunk As AlternativeFormatImportPart = mainDocPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Xhtml, 
                   altChunkId) 
     Dim strHTML As String = "<html><head/><body><h1>Html Heading</h1><p>This is an html document in a string literal.</p></body></html>" 
     Using chunkStream As Stream = chunk.GetStream(FileMode.Create, FileAccess.Write) 
      Using sr As StreamWriter = New StreamWriter(chunkStream) 
       sr.Write(strHTML) 
      End Using 
     End Using 

     Dim altChunk As New AltChunk 
     altChunk.Id = altChunkId 

     mainDocPart.Document.Body.InsertAfter(altChunk, mainDocPart.Document.Body.Elements(Of Paragraph)().Last()) 
     mainDocPart.Document.Save() 
    End Using 

看來你不能導入AltChunk到內存流,你只能當你打開物理文件做寫作。任何人都可以在這個問題上談一談嗎?