I am developing a Web API project in Asp.net core 2.0. I am in need of a library or way to create Word document. I have searched an tried NPOI and DocX. Both are not as good as expected. Can anyone suggest me a tool?
A DOCX file is a document created by Microsoft Word or exported by another word processing program, such as OpenOffice Writer or Apple Pages.
At first glance, the below link can help somehow:
https://asp.net-hacker.rocks/2017/02/23/word-document-formatter-in-aspnetcore.html
Anyway, about DOCX - Word Document using Open XML SDK by Microsoft - you can install Open XML SDK into your solution using the version 2.8.1. It´s all free.
Documentation avaliable at:
On GIT => https://github.com/OfficeDev/Open-XML-SDK ;
On MSDN => https://docs.microsoft.com/en-us/office/open-xml/open-xml-sdk
ps: the MSDN documentation is all about the version SDK 2.5 instead of 2.8.1, but as explained in the GIT link there is no substancial changes.
Anyway to use it in a Web APP CORE 2.0 you can do the follow:
Reference the below namespaces within your controller:
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
If you just want to save it in a folder locally do something like:
public static void CreateWordprocessingDocument(string filepath)
{
    // Create a document by supplying the filepath. 
    using (WordprocessingDocument wordDocument =
        WordprocessingDocument.Create(filepath, WordprocessingDocumentType.Document))
    {
        // 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("Create text in body - CreateWordprocessingDocument"));
    }
}
and call it like:
 public IActionResult GenerateDocx()
    {
        string filePath = @"c:\word\Invoice.docx";
        CreateWordprocessingDocument(filePath);
    }
If you want to generate a docx to be saved into a users computer from their browsers, after hitting a link, do something like:
// GET verb
public IActionResult GenerateDocxBrowser()
{
    // open xml sdk - docx
    using (MemoryStream mem = new MemoryStream())
    {
        using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(mem, DocumentFormat.OpenXml.WordprocessingDocumentType.Document, true))
        {
            wordDoc.AddMainDocumentPart();
            // siga a ordem
            Document doc = new Document();
            Body body = new Body();
            // 1 paragrafo
            Paragraph para = new Paragraph();
            ParagraphProperties paragraphProperties1 = new ParagraphProperties();
            ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId() { Val = "Normal" };
            Justification justification1 = new Justification() { Val = JustificationValues.Center };
            ParagraphMarkRunProperties paragraphMarkRunProperties1 = new ParagraphMarkRunProperties();
            paragraphProperties1.Append(paragraphStyleId1);
            paragraphProperties1.Append(justification1);
            paragraphProperties1.Append(paragraphMarkRunProperties1);
            Run run = new Run();
            RunProperties runProperties1 = new RunProperties();
            Text text = new Text() { Text = "The OpenXML SDK rocks!" };
            // siga a ordem 
            run.Append(runProperties1);
            run.Append(text);
            para.Append(paragraphProperties1);
            para.Append(run);
            // 2 paragrafo
            Paragraph para2 = new Paragraph();
            ParagraphProperties paragraphProperties2 = new ParagraphProperties();
            ParagraphStyleId paragraphStyleId2 = new ParagraphStyleId() { Val = "Normal" };
            Justification justification2 = new Justification() { Val = JustificationValues.Start };
            ParagraphMarkRunProperties paragraphMarkRunProperties2 = new ParagraphMarkRunProperties();
            paragraphProperties2.Append(paragraphStyleId2);
            paragraphProperties2.Append(justification2);
            paragraphProperties2.Append(paragraphMarkRunProperties2);
            Run run2 = new Run();
            RunProperties runProperties3 = new RunProperties();
            Text text2 = new Text();
            text2.Text = "Teste aqui";
            run2.AppendChild(new Break());
            run2.AppendChild(new Text("Hello"));
            run2.AppendChild(new Break());
            run2.AppendChild(new Text("world"));
            para2.Append(paragraphProperties2);
            para2.Append(run2);
            // todos os 2 paragrafos no main body
            body.Append(para);
            body.Append(para2);
            doc.Append(body);
            wordDoc.MainDocumentPart.Document = doc;
            wordDoc.Close();
        }
        return File(mem.ToArray(), "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "ABC.docx");
    }
}
the above code even shows how to use the most important objects: body, paragraphs, runs and text. Remember to follow this order always!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With