2011-12-23 20 views
5

kullanarak AddAlternativeFormatImportPart'ı çağırdıktan sonra bozuk belge Belgede bir AltChunk aracılığıyla başvuruda bulunmak için bir .docx dosyasında AddAlternativeFormatImportPart oluşturmaya çalışıyorum. Sorun, aşağıdaki kodun docx dosyasının Word tarafından bozulmuş olarak okunmasına neden olduğu ve açılamamasıdır.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(); 

cevap

7

Sana AlternativeFormatImportPart gelen akışı handeling nasıl bu olabilir düşünüyorum. Aşağıdaki örnekte olduğu gibi FeedData kullanmayı deneyin.

 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

: Cevabınız çok kullanışlıdır. Sorunuma bir ipucu verebilir misiniz ... html verilerini kelime belgesine aktarmak yerine, ilgili html verisi için OOXML biçimlendirilmiş dizgisi almak istiyorum. Güncellemeye gerek yok document.i kelimesi sadece ooxml formatlı dizgi ister ... – Saravanan

3

Sana bir bellek akışından açıldığında bir belgeye bir AltChunk alamıyor çünkü öyle düşünüyorum. Bende aynı sorun vardı. Ben şöyle bir bellek akışından şablonu açıyordu:

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 

Bu vs. içerik kontrolleri normal güncellemeler için çalışır ve geri istemciye akışı veya docx olarak kaydedildiğinde belge gayet iyi. Ancak, bir AltChunk eklerken dokümanı bozar. şöyle AltChunk eklerken fiziksel dosya yolu bir doküman açma

çalışır:

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 

bir bellek akışı içine bir AltChunk alamıyor görünüyor fiziksel dosyayı için açtığınızda, bunu sadece yapabilirsiniz yazı. Bu konuda biraz ışık tutabilir mi?

İlgili konular