2011-12-23 18 views
5

का उपयोग करके AddAlternativeFormatImportPart को कॉल करने के बाद दूषित दस्तावेज़ मैं AltDunk के माध्यम से दस्तावेज़ में संदर्भित करने के लिए .docx फ़ाइल में AddAlternativeFormatImportPart बनाने का प्रयास कर रहा हूं। समस्या यह है कि कोड के नीचे docx फ़ाइल वर्ड द्वारा के रूप में भ्रष्ट को पढ़ने के लिए कारण बनता है और खोला नहीं जा सकता है।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(); 

उत्तर

7

मुझे लगता है कि यह हो सकता है कि आप वैकल्पिक FormatImportPart से स्ट्रीम को कैसे संभालेंगे। इसके बजाय मेरे उदाहरण में फीडडेटा का उपयोग करने का प्रयास करें।

 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

: आपका उत्तर बहुत उपयोगी है। क्या आप मुझे मेरी समस्या के लिए एक टिप दे सकते हैं ... शब्द दस्तावेज़ में एचटीएमएल डेटा खिलाए जाने के बजाय, मैं संबंधित एचटीएमएल डेटा के लिए ओओएक्सएमएल स्वरूपित स्ट्रिंग प्राप्त करना चाहता हूं। अपडेट करने की आवश्यकता नहीं है। शब्द document.i केवल ओक्सएमएल स्वरूपित स्ट्रिंग चाहते हैं ... – Saravanan

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 आयात नहीं कर सकते, तो आप इसे केवल कर सकते हैं जब आप के लिए भौतिक फ़ाइल को खोलने के लिख रहे हैं। क्या कोई इस मामले पर कुछ प्रकाश डाल सकता है?