Click here to Skip to main content
15,389,584 members
Articles / Web Development / ASP.NET
Posted 29 Jan 2009


42 bookmarked

HTML to WordML

Rate me:
Please Sign up or sign in to vote.
4.71/5 (9 votes)
29 Jan 2009CPOL2 min read
Class supporting dynamic creation of a .docx based on a template. Supports HTML content.


The code provided creates a new docx document based on a previously created template.

The templates have bookmarks in the document body, header and footer. Their content is set dynamically.

It also supports the insertion of HTML formatted content in the document body.


This solution is based on this article by Praveen Bonakurthi. I made his code a bit more user friendly and added the HTML functionality.

Getting Started

First, you need to create a docx template. Just open Word and create the file as you please.
In the areas where you want to insert plain text, just select the area and go to the ribbon toolbar, insert>bookmark, give it a unique name. You can apply Word formatting to the text that will be inserted later.

Setting HTML Content Locations

For HTML content, it's a bit more tricky. So just finish up adding all bookmarks for the plain text before you do this step.

Change the docx extension to zip. Open it and open Word/document.xml with any editor you like (I just use Notepad).

Place <w:altChunk r:id="IdForTheHtmlContent" /> nodes under the <w:body> node.

Replace "IdForTheHtmlContent" with whatever unique id you want.

Put them where you want the HTML to appear.

Save the file back when you're done. Change the extension back to .docx.

Now you got your template ready to be used!

Using the Code

There are just 2 methods to be used:

public static string CreateWordDocument(string templatePath, 
	Dictionary<string, string> Bookmarks, Dictionary<string, string> 
	BookmarksHeaderFooter, Dictionary<string, string> HtmlChunks) 

Defined in the class MyWordMLHTMLClasses.WordMl, this method is responsible for the creation of the document.

The method...

private void ReturnStream(string filepath, bool DeleteFileAfter) 

... returns the generated file in the HTTP Response stream and may or not delete it later.

This is how you use it:

// get values ready for insert in the docx file
Dictionary<string, string> bookmarks = new Dictionary<string, string>();
Dictionary<string, string> bookmarksHeaderFooter = new Dictionary<string, string>();
Dictionary<string, string> htmlChunks = new Dictionary<string, string>();
// HTML chuncks in the document area
htmlChunks.Add("S_Teste", "<b>Text HTML</b>" + 
"<br />simple html text after br<br /> " + 
"<table style=\"width:250px;\"><tr>" + 
"<td>html table cell 1</td>" + 
"<td>html table cell 2</td></tr><tr>" + 
"<td>html table cell 3</td>" + 
"<td>html table cell 4</td>" + 
// bookmarks in the document area
bookmarks.Add("S_ADDRESS_V1", "Adress line 1");
bookmarks.Add("S_ADDRESS_V2", "Adress line 2");
// bookmarks in Header/Footer
bookmarksHeaderFooter.Add("FOOTER_1_1", "Inserted Footer Text");
bookmarksHeaderFooter.Add("FOOTER_1_2", "123");
bookmarksHeaderFooter.Add("HEADER5", "Inserted Header Text");

// generate docx file from template docx
string fileName = WordML.CreateWordDocument(
    Server.MapPath(@"~\_Documents\MyTemplate.docx"), // template docx path
    bookmarks, // bookmarks and Values
    bookmarksHeaderFooter, // header/footer bookmarks and Values
    htmlChunks // HTML chunks to be inserted 

// returns file in stream, deletes it afterwards 
//(if option is selected as in this case)
ReturnStream(fileName, true);

Points of Interest

I did some extensive searching to find any HTML to Word ML snippet. Got nothing close to a finished snippet, so this may be useful.

If too many people find it hard to understand, I'll edit and post a better explanation on how to use the stuff.

Download the code, it will probably be simple to understand after watching it in action.

How To Use It On Your Projects?

  1. Download the code.
  2. Copy the WordML.cs to your project folder and add it to your project in Visual Studio.
  3. Add a reference to windowsbase.dll.
  4. Use it as shown above.


  • Download bug solved with a little help from stikoian


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Paulo Vaz
Software Developer (Senior) WEBA, Lda
Portugal Portugal
Computer Engineer from ISEL, Lisbon

Founder and partner of WEBA, Lda.

Software Developer (and sometimes Network Manager)

Comments and Discussions

QuestionLandscape Pin
wq723-Nov-12 9:21
Memberwq723-Nov-12 9:21 
QuestionIn c# 4.0 Pin
vinnygambonni29-Jun-12 5:24
Membervinnygambonni29-Jun-12 5:24 
GeneralWithout saving data on the server Pin
athiratha4-Jun-11 3:40
Memberathiratha4-Jun-11 3:40 
GeneralRe: Without saving data on the server Pin
Gloold1-Oct-15 2:53
MemberGloold1-Oct-15 2:53 
QuestionWhat about adding images ? Pin
Member 20977815-Mar-11 13:21
MemberMember 20977815-Mar-11 13:21 
GeneralPerfect, but... Pin
Quietcougar12-Jan-11 6:03
MemberQuietcougar12-Jan-11 6:03 
QuestionSpecial characters in html Pin
inferno66625-Aug-10 3:04
Memberinferno66625-Aug-10 3:04 
AnswerRe: Special characters in html Pin
inferno66625-Aug-10 3:32
Memberinferno66625-Aug-10 3:32 
AnswerRe: Special characters in html Pin
Paulo Vaz25-Aug-10 4:04
MemberPaulo Vaz25-Aug-10 4:04 
GeneralRe: Special characters in html Pin
Paulo Vaz25-Aug-10 4:06
MemberPaulo Vaz25-Aug-10 4:06 
QuestionError when creating my own template Pin
poisonaby12-Jul-10 1:24
Memberpoisonaby12-Jul-10 1:24 
GeneralFixed - HTML now also works on Bookmarks Pin
wicusv27-Jun-10 23:16
Memberwicusv27-Jun-10 23:16 
GeneralDOCX created in _Documents not deleted by f.Delete(); Pin
nickcr24-Jun-10 15:00
Membernickcr24-Jun-10 15:00 
QuestionWord 2003 Pin
Bluebamboo15-Jun-10 11:22
MemberBluebamboo15-Jun-10 11:22 
AnswerRe: Word 2003 Pin
Paulo Vaz17-Jun-10 3:39
MemberPaulo Vaz17-Jun-10 3:39 
GeneralRe: Word 2003 Pin
Bluebamboo17-Jun-10 4:05
MemberBluebamboo17-Jun-10 4:05 
QuestionHow to add a pagebreak? Pin
nickcr11-May-10 16:34
Membernickcr11-May-10 16:34 
AnswerRe: How to add a pagebreak? Pin
nickcr11-May-10 17:34
Membernickcr11-May-10 17:34 
GeneralMuito bom! Pin
Industria Virtual3-Feb-09 7:08
professionalIndustria Virtual3-Feb-09 7:08 
GeneralRe: Muito bom! Pin
Paulo Vaz3-Feb-09 13:35
MemberPaulo Vaz3-Feb-09 13:35 
AnswerGreat Article and Bug Fixed [modified] Pin
SteveTKO29-Jan-09 15:30
MemberSteveTKO29-Jan-09 15:30 
GeneralRe: Great Article and Bug Fixed Pin
Paulo Vaz29-Jan-09 16:47
MemberPaulo Vaz29-Jan-09 16:47 
QuestionHow do I change my docx to enable html injection without breaking my docx when rezipping? Pin
Jakob Flygare16-Jun-09 3:58
MemberJakob Flygare16-Jun-09 3:58 
When I unzip my docx and rezip it and opens it I get the messsage "The file filename.docx cannot be opened because there are problems with the contents." With detail: some parts are missing or invalid.

How do I change my docx to enable html injection without breaking my docx when rezipping?
AnswerRe: How do I change my docx to enable html injection without breaking my docx when rezipping? Pin
Jimburg25-Aug-09 16:53
MemberJimburg25-Aug-09 16:53 
GeneralRe: How do I change my docx to enable html injection without breaking my docx when rezipping? Pin
Paulo Vaz26-Aug-09 3:20
MemberPaulo Vaz26-Aug-09 3:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.