Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

create word document with Open XML

I am creating a sample handler to generate simple Word document.
This document will contains the text Hello world

This is the code I use (C# .NET 3.5),
I got the Word document created but there is no text in it, the size is 0.
How can I fix it?
(I use CopyStream method because CopyTo is available in .NET 4.0 and above only.)

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);
        }
    }
}
like image 584
Tuyen Nguyen Avatar asked Apr 24 '13 14:04

Tuyen Nguyen


People also ask

Can I open XML with word?

XML files can be opened in a browser like IE or Chrome, with any text editor like Notepad or MS-Word. Even Excel can be used to open XML files.

Is Office Open XML the same as docx?

The Open XML format (. docx/. xlsx/. pptx) is the default format in all supported versions of Microsoft Office and, unless you have a specific reason to use a different format, it's the format we recommend using for your Office files.

What is Office Open XML word processing?

Office Open XML (OpenXML) is a proposed open standard for word-processing documents, presentations, and spreadsheets that can be freely implemented by multiple applications on multiple platforms.


3 Answers

string Filepath = @"C:\Users\infinity\Desktop\zoyeb.docx";
using (var wordprocessingDocument = WordprocessingDocument.Create(Filepath, DocumentFormat.OpenXml.WordprocessingDocumentType.Document))
{
    MainDocumentPart mainPart = wordprocessingDocument.AddMainDocumentPart();
    mainPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document();
    Body body = mainPart.Document.AppendChild(new Body());
    DocumentFormat.OpenXml.Wordprocessing.Paragraph para = body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph());
    DocumentFormat.OpenXml.Wordprocessing.Run run = para.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run());
    run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text("siddiq"));
    wordprocessingDocument.MainDocumentPart.Document.Save();
}

go to nuget package manager and install this first into your project

Install-Package DocumentFormat.OpenXml -Version 2.8.1
like image 99
Zoyeb Shaikh Avatar answered Oct 28 '22 02:10

Zoyeb Shaikh


This works for me, by putting the streaming code in the outer USING block.

This causes a call to WordprocessingDocument.Close (via the Dispose method).

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();
    }
}
like image 24
Tuyen Nguyen Avatar answered Oct 28 '22 03:10

Tuyen Nguyen


I have modifed your code to make it work. I can open it correctly after save download it. Please see my modified below. Hope this help.

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();
    }
}
like image 2
Toan Vo Avatar answered Oct 28 '22 03:10

Toan Vo