2013-04-24 7 views
6

के साथ शब्द दस्तावेज़ बनाएं मैं सरल शब्द दस्तावेज़ उत्पन्न करने के लिए नमूना हैंडलर बना रहा हूं।
इस दस्तावेज़ इच्छा पाठ शामिल हैलो वर्ल्डओपन एक्सएमएल

इस कोड का उपयोग मैं (सी # .NET 3.5),
मेरे द्वारा बनाए गए वर्ड दस्तावेज़ मिल गया है, लेकिन यह करने में कोई पाठ का आकार 0 नहीं है, तो।
मैं इसे कैसे ठीक कर सकता हूं?
(मैं CopyStream विधि का उपयोग करें क्योंकि CopyTo .NET 4.0 में और केवल ऊपर उपलब्ध है।)

public class HandlerCreateDocx : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     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(); 

       // Create the document structure and add some text. 
       mainPart.Document = new Document(); 
       Body body = mainPart.Document.AppendChild(new Body()); 
       Paragraph para = body.AppendChild(new Paragraph()); 
       Run run = para.AppendChild(new Run()); 
       run.AppendChild(new Text("Hello world!")); 
       mainPart.Document.Save(); 
       // Stream it down to the browser 
       context.Response.AppendHeader("Content-Disposition", "attachment;filename=HelloWorld.docx"); 
       context.Response.ContentType = "application/vnd.ms-word.document"; 
       CopyStream(mem, context.Response.OutputStream); 
       context.Response.End(); 
      } 
     } 
    } 

    // Only useful before .NET 4 
    public void CopyStream(Stream input, Stream output) 
    { 
     byte[] buffer = new byte[16 * 1024]; // Fairly arbitrary size 
     int bytesRead; 

     while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      output.Write(buffer, 0, bytesRead); 
     } 
    } 
} 
+1

मैं आपके दस्तावेज़ को डीबग करने के लिए ओपन एक्सएमएल उत्पादकता उपकरण का उपयोग करने की सलाह देता हूं। दस्तावेज़ को पहले Word में बनाने पर विचार करें और फिर टूल को बनाने के लिए टूल का उपयोग करने के लिए टूल का उपयोग करें। – juharr

उत्तर

2

मैं यह काम करने के लिए अपने कोड modifed है। इसे डाउनलोड करने के बाद मैं इसे सही तरीके से खोल सकता हूं। कृपया नीचे संशोधित देखें। उममीद है कि इससे मदद मिलेगी।

using (MemoryStream documentStream = new MemoryStream()) 
{ 
    using (WordprocessingDocument myDoc = WordprocessingDocument.Create(documentStream, WordprocessingDocumentType.Document, true)) 
    { 
     // Add a new main document part. 
     MainDocumentPart mainPart = myDoc.AddMainDocumentPart(); 
     //Create Document tree for simple document. 
     mainPart.Document = new Document(); 
     //Create Body (this element contains 
     //other elements that we want to include 
     Body body = new Body(); 
     //Create paragraph 
     Paragraph paragraph = new Paragraph(); 
     Run run_paragraph = new Run(); 
     // we want to put that text into the output document 
     Text text_paragraph = new Text("Hello World!"); 
     //Append elements appropriately. 
     run_paragraph.Append(text_paragraph); 
     paragraph.Append(run_paragraph); 
     body.Append(paragraph); 
     mainPart.Document.Append(body); 

     // Save changes to the main document part. 
     mainPart.Document.Save(); 
     myDoc.Close(); 
     context.Response.ClearContent(); 
     context.Response.ClearHeaders(); 
     context.Response.ContentEncoding = System.Text.Encoding.UTF8; 
     SetContentType(context.Request, context.Response, "Simple.docx"); 
     documentStream.Seek(0, SeekOrigin.Begin); 
     documentStream.CopyTo(context.Response.OutputStream); 
     context.Response.Flush(); 
     context.Response.End(); 
    } 
} 
+0

आपका उत्तर अनावश्यक है। और आप हमारे ऊपर कई बेकार रेखाएं फेंकते हैं जो व्यवहार को नहीं बदलते हैं। मेरा सुझाव है कि आप अपना जवाब हटा दें। – SandRock

8

यह बाहरी उपयोग ब्लॉक में स्ट्रीमिंग कोड डालकर मेरे लिए काम करता है।

इससे WordprocessingDocument.Close (निपटान विधि के माध्यम से) का कॉल होता है।

public void ProcessRequest(HttpContext context) 
{ 
    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(); 

      // Create the document structure and add some text. 
      mainPart.Document = new Document(); 
      Body body = mainPart.Document.AppendChild(new Body()); 
      Paragraph para = body.AppendChild(new Paragraph()); 
      Run run = para.AppendChild(new Run()); 
      run.AppendChild(new Text("Hello world!")); 
      mainPart.Document.Save(); 
     } 

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

ग्रेट। मुझे आपके जैसे पोस्ट के समान समाधान मिला है लेकिन यह बहुत देर हो गया है। –

+0

हम यहां कुछ बिंदुओं पर विचार कर सकते हैं जो हम यहां गायब हैं: स्ट्रीम प्रोसेसिंग दस्तावेज़ को स्ट्रीम भेजने से पहले बंद करने की आवश्यकता है। धारा शुरुआत में शुरू होनी चाहिए। यहां आपके पोस्ट समाधान के लिए धन्यवाद। –

संबंधित मुद्दे