2011-12-23 34 views
5

Tôi đang cố gắng tạo AddAlternativeFormatImportPart trong tệp .docx để tham chiếu nó trong tài liệu qua AltChunk. vấn đề là mã bên dưới làm cho tệp docx bị đọc là bị hỏng bởi Word và không thể mở được.Tài liệu bị hỏng sau khi gọi AddAlternativeFormatImportPart bằng OpenXml

 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(); 

Trả lời

7

Tôi nghĩ rằng đó có thể là cách bạn xử lý luồng từ AlternativeFormatImportPart. Hãy thử sử dụng FeedData thay vào đó, như trong ví dụ bên dưới của tôi.

 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

: Câu trả lời của bạn rất hữu ích. Bạn có thể cho tôi mẹo về vấn đề của tôi ... thay vì cho dữ liệu html vào tài liệu từ, tôi muốn nhận chuỗi định dạng OOXML cho dữ liệu html tương ứng. Không cần cập nhật tài liệu word.i chỉ muốn chuỗi định dạng ooxml ... – Saravanan

3

Tôi nghĩ rằng đó là vì bạn không thể nhập AltChunk vào tài liệu được mở từ luồng bộ nhớ. Tôi gặp vấn đề tương tự. Tôi đã mở mẫu từ một luồng bộ nhớ như vậy:

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 

Điều này làm việc cho các cập nhật bình thường của kiểm soát nội dung và tài liệu vẫn ổn khi được truyền lại cho khách hàng hoặc lưu dưới dạng docx. Nhưng nó làm hỏng tài liệu khi chèn AltChunk.

Mở doc từ một đường dẫn tập tin vật lý hoạt động khi chèn AltChunk như vậy:

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 

Có vẻ như bạn không thể nhập một AltChunk vào một dòng bộ nhớ, bạn chỉ có thể làm điều đó khi bạn mở tập tin vật lý cho viết. Có ai có thể làm sáng tỏ vấn đề này không?

Các vấn đề liên quan