2012-05-19 18 views
16

मैं ब्राउज़र के लिए नीचे उड़ एक शब्द दस्तावेज़ है कि मैं पर बनाने स्ट्रीम करने में असमर्थ हूँ का उपयोग कर। मुझे लगातार माइक्रोसॉफ्ट वर्ड से एक संदेश मिल रहा है कि दस्तावेज़ दूषित है।स्ट्रीमिंग OpenXML SDK डब्ल्यू "भ्रष्ट" दस्तावेज़ में/ASP.NET परिणाम

जब मैं एक कंसोल आवेदन के माध्यम से कोड को चलाने और ASP.NET तस्वीर से बाहर ले, दस्तावेज़ सही ढंग से कोई समस्या नहीं के साथ उत्पन्न होता है। मेरा मानना ​​है कि सबकुछ फाइल लिखने के आसपास केंद्रित है। - लेकिन कुछ भी काफी काम करता है

using (MemoryStream mem = new MemoryStream()) 
      { 
       // Create Document 
       using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(mem, 
      WordprocessingDocumentType.Document, true)) 
       { 
        // Add a main document part. 
        MainDocumentPart mainPart = wordDocument.AddMainDocumentPart(); 

        new Document(new Body()).Save(mainPart); 

        Body body = mainPart.Document.Body; 
        body.Append(new Paragraph(
           new Run(
            new Text("Hello World!")))); 

        mainPart.Document.Save(); 
        // Stream it down to the browser 

        // THIS IS PROBABLY THE CRUX OF THE MATTER <--- 
        Response.AppendHeader("Content-Disposition", "attachment;filename=HelloWorld.docx"); 
        Response.ContentType = "application/vnd.ms-word.document"; 
        mem.WriteTo(Response.OutputStream); 
        Response.End(); 
       } 

      } 

मैं links का एक बहुत पर looked है:

यहाँ मेरी कोड है। मैं बहुत से लोग MemoryStream.WriteTo का उपयोग करते हैं और कुछ बाइनरीवाइट का उपयोग करते हैं - इस बिंदु पर मुझे यकीन नहीं है कि सही तरीका क्या है। इसके अलावा, मैं लंबे समय तक सामग्री प्रकार है, यानी आवेदन/vnd.openxmlformats-officedocument.wordprocessingml.document लेकिन कोई किस्मत की कोशिश की है।

कुछ स्क्रीनशॉट - भले ही आप आप जो लोग इस प्रश्न पर ठोकर के लिए एक ही "भागों गुम या अमान्य कर रहे हैं"

समाधान मिलता है ठीक करने के लिए प्रयास करें:

का उपयोग कर के भीतर() .. WordProcessingDocument के निर्देश, आप कॉल करना होगा:

wordDocument.Save();

भी सही ढंग से MemoryStream स्ट्रीम करने के लिए, बाहरी का उपयोग कर ब्लॉक में इस का उपयोग करें:

Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 
       Response.AppendHeader("Content-Disposition", "attachment;filename=HelloWorld.docx"); 
       mem.Position = 0; 
       mem.CopyTo(Response.OutputStream); 
       Response.Flush(); 
       Response.End(); 

enter image description here enter image description here

+0

आप कैसे एक wordDocument.Save जोड़ सकता हूँ(); ? मैंने कोशिश की और इसके करीब एकमात्र संभावित कोड है।() और यह मेरे लिए काम नहीं करता है। – RicL

+1

अपने प्रश्न और उत्तर के लिए kd7 धन्यवाद। –

उत्तर

7

उपयोग CopyTo बजाय, वहाँ जो इसे लिखने के लिए असफल बनाता WriteTo में एक बग है बफर की पूरी सामग्री जब लक्ष्य धारा एक ही समय में सब कुछ लिखने का समर्थन नहीं करती है।

1

मेरा मानना ​​है कि अपने ContentType मूल्य गलत है; यह शब्द 97 - 2003 प्रारूप के लिए है। इसे बदलें:

application/vnd.openxmlformats-officedocument.wordprocessingml.document 

और देखें कि यह समस्या को हल करता है या नहीं।

2

मैंने आपके कोड की प्रतिलिपि बनाई और चिपकाया और देखा कि: "wordDocument.close();" क्लॉसूल गायब था, इसे जोड़ा और यह काम किया (मैंने एएसपी.नेट एमवीसी में एक एक्शन विट किया था)

2

.NET Framework 3.5 और निम्न के लिए संस्करण के रूप में। ढांचे के इस संस्करण में क्लास स्ट्रीम में CopyTo विधि नहीं है। इसलिए, विधि WriteTo अगले कोड की जगह:

   byte[] arr = documentStream.ToArray(); 
       fileStream.Write(arr, 0, arr.Length); 

उदाहरण http://blogs.msdn.com/b/mcsuksoldev/archive/2010/04/09/creating-a-new-microsoft-word-document-from-a-template-using-openxml.aspx

0

से मिला था रोडिओन के जवाब पर विस्तार और सवाल यह है कि क्या मेरे लिए काम किया में इस्तेमाल किया चर से मेल करने के लिए:

Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 
Response.AppendHeader("Content-Disposition", "attachment;filename=HelloWorld.docx"); 
mem.Position = 0; 
byte[] arr = mem.ToArray(); 
Response.BinaryWrite(arr); 
Response.Flush(); 
Response.End(); 
संबंधित मुद्दे