This will be the first in a short series of articles to show how we use Open XML.
Open XML is a Microsoft format which can be used to programmatically create Word documents.
Below is a code example and associated output.
I have not shown all the code examples yet as these will be explained in future blogs.
The code shown constructs a page containing a header and footer, a document heading, some normal text a table and a watermark. Styling has been applied to all these elements.
I have created separate classes and methods to encapsulate the commonly used code, otherwise the code becomes inflated and unreadable.
//------------------------------------------------------------------------------------------------- // <copyright file="Default.aspx.cs" company="PSP"> // Copyright (c) PSP. All rights reserved. // </copyright> //------------------------------------------------------------------------------------------------- namespace ExportToWord using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.UI; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Vml.Office; using DocumentFormat.OpenXml.Wordprocessing; public partial class _Default : System.Web.UI.Page protected void ExportToWord_Click(object sender, EventArgs e) string documentFilename = "OpenXML Export To Word Example.docx"; using (MemoryStream documentStream = new MemoryStream()) //// Create a Wordprocessing document. using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(documentStream, WordprocessingDocumentType.Document)) //// Add a new main document part. MainDocumentPart mainPart = wordDoc.AddMainDocumentPart(); ////Create DOM tree for a simple document. mainPart.Document = new Document(); mainPart.Document.Body = new Body(); //// Add a header part HeaderPart headerPart = WordDocument.CreateHeaderPart(wordDoc); ////Create the header content CreateHeader(wordDoc, headerPart); //// Add a text watermark TextWatermark textWatermark = new TextWatermark(); textWatermark.AddWatermark(wordDoc, "DRAFT", "font-family:\"Calibri\";font-size:medium", "#C0C0C0"); //// Add a footer part FooterPart footerPart = WordDocument.CreateFooterPart(wordDoc); //// Create the footer content string footerText = "Example footer text"; CreateFooter(mainPart, footerText, JustificationValues.Left, footerPart); //// Get the Styles part for this document. StyleDefinitionsPart part = mainPart.StyleDefinitionsPart; //// If the Styles part does not exist, add it. if (part == null) part = WordDocument.AddStylesPartToPackage(wordDoc); //// Create and add all the character styles //// This will set the font, font size, color, bold and italics WordDocument.CreateAndAddCharacterStyle(part, "Heading1", "Heading1", "Heading1", "Calibri", "56", string.Empty, true, false); WordDocument.CreateAndAddCharacterStyle(part, "Normal", "Normal", "Normal", "Calibri", "22", string.Empty, false, false); WordDocument.CreateAndAddCharacterStyle(part, "NormalBold", "Normal Bold", "Normal Bold", "Calibri", "22", string.Empty, true, false); WordDocument.CreateAndAddCharacterStyle(part, "NormalGrey", "Normal Grey", "Normal Grey", "Calibri", "22", "808080", false, false); WordDocument.CreateAndAddCharacterStyle(part, "NormalGreySmall", "Normal Grey Small", "Normal Grey Small", "Calibri", "18", "75A3A3", false, false); WordDocument.CreateAndAddCharacterStyle(part, "TableCellHeaderStyle", "Table Cell Style", "Table Cell Style", "Calibri", "22", string.Empty, true, false); WordDocument.CreateAndAddCharacterStyle(part, "TableCellStyle", "Table Cell Style", "Table Cell Style", "Calibri", "22", string.Empty, false, false); Body body = new Body(); Paragraph p = new Paragraph(); //// This creates a normal page margin of 2.54 cm (1440) SectionProperties sectionProps = new SectionProperties(); PageMargin pageMargin = new PageMargin() Top = 1440, Right = (UInt32Value)1440U, Bottom = 1440, Left = (UInt32Value)1440U ; sectionProps.Append(pageMargin); body.Append(sectionProps); //// Create the heading text Run runHeading = new Run(); runHeading.RunProperties = new RunProperties() RunStyle = new RunStyle() Val = "Heading1" ; runHeading.Append(new Text("OpenXML Example")); p = new Paragraph(new Run(runHeading)); body.Append(p); //// Create the normal text Run runNormalText = new Run(); runNormalText.RunProperties = new RunProperties() RunStyle = new RunStyle() Val = "Normal" ; runNormalText.Append(new Text("This is an example page for OpenXML usage.")); p = new Paragraph(new Run(runNormalText)); body.Append(p); mainPart.Document.Append(body); body = new Body(); CreateTable(body); //// Add a break after the paragraph p = new Paragraph(new Run(new Break())); body.Append(p); mainPart.Document.Append(body); mainPart.Document.Save(); wordDoc.Close(); //// Send the document to the browser WordDocument.RespondStreamToWord(documentStream, documentFilename); //// End word doc //// End Memory Stream