In this article I will demonstrate how we can use an Office Add-In to perform simple search and replace function within a Word document. This is particularly useful when you want to use an external cloud source to insert data into your documents.
Introduction
This example comes directly from the Microsoft GitHub example on Word Add-In Document Assembly. (https://github.com/OfficeDev/Word-Add-in-DocumentAssembly). The reason I am blogging about it is that it did not appear in any searches for me and I stumbled across it purely by accident.
Filling a document template
Setup
I grabbed a sample word document template from Word Online (https://templates.office.com/en-sg/Formal%20business%20letter-TM00002133) and we are going to replace the items in this document programmatically.
I created a blank Word Add-In locally and then inserted my local FirebugLite capability just to create a quick and easy demo without having to go through the trouble of hosting the code anywhere.
Basic search and replace
The basic code for search and replace is as follows:
function handleSuccess() { app.showNotification("Replacement successful", "Success"); } function handleError(result) { app.showNotification("Error", "ErrorCode = " + result.code + ", ErrorMessage = " + result.message); } Word.run(function (ctx) { // Queue a command to search the document for the string "Contoso". // Create a proxy search results collection object. var results = ctx.document.body.search("[Recipient Name]"); //Search for the text to replace // Queue a command to load all of the properties on the search results collection object. ctx.load(results); // Synchronize the document state by executing the queued commands, // and returning a promise to indicate task completion. return ctx.sync().then(function () { // Once we have the results, we iterate through each result and set some properties on // each search result proxy object. Then we queue a command to wrap each search result // with a content control and set the tag and title property on the content control. for (var i = 0; i < results.items.length; i++) { results.items[i].insertHtml("Marky The Receiver", "replace"); //Replace the text HERE } }) // Synchronize the document state by executing the queued commands. .then(ctx.sync) .then(function () { handleSuccess(); }) .catch(function (error) { handleError(error); }) });
Running this example we can see the replacement was successful in both places
So to complete this as an example for the whole document I use a sample data object as it would be returned from a cloud REST provider and cycle through all the elements to be replaced.
function handleSuccess() { app.showNotification("Replacement successful", "Success"); } function handleError(result) { app.showNotification("Error", "ErrorCode = " + result.code + ", ErrorMessage = " + result.message); } var data = { date: "22 Aug 2016", sender: "Someone really important", company1: "The Boss | Company 1 | Somewhere | Here | There | 12345", company2: "The Bigger Boss | Company 2 | Somewhere else | Near | Canada | 98765" } Word.run(function (ctx) { var results = ctx.document.body.search("[Recipient Name]"); //Search for the text to replace ctx.load(results); return ctx.sync().then(function () { for (var i = 0; i < results.items.length; i++) { results.items[i].insertHtml("Marky The Receiver", "replace"); //Replace the text HERE } }) .then(ctx.sync) .then(function () { var results = ctx.document.body.search("[Date]"); //Search for the text to replace ctx.load(results); return ctx.sync().then(function () { for (var i = 0; i < results.items.length; i++) { results.items[i].insertHtml(data.date, "replace"); //Replace the text HERE } }) .then(ctx.sync) .then(function () { var results = ctx.document.body.search("[Title | Company | Address | City | State | Zip]"); //Search for the text to replace ctx.load(results); return ctx.sync().then(function () { results.items[0].insertHtml(data.company1, "replace"); //Replace the text HERE results.items[1].insertHtml(data.company2, "replace"); //Replace the text HERE }) .then(ctx.sync) .then(function () { var results = ctx.document.body.search("[Sender Name]"); //Search for the text to replace ctx.load(results); return ctx.sync().then(function () { for (var i = 0; i < results.items.length; i++) { results.items[i].insertHtml(data.sender, "replace"); //Replace the text HERE } }) .then(ctx.sync) .then(function () { handleSuccess(); }) }) }) }) .catch(function (error) { handleError(error); }) });
And here’s the final output
Conclusion
Using the Word JavaScript API through an Office Add-In we are able to use a search and replace technique to take external data and complete a template. This is especially powerful when you consider it in the context of a cloud service integration like O365, or CRM clouds like MS Dynamics or Salesforce.
[…] previous articles we have looked at how to programmatically interact with a Word document from within an Office Add-In. In this case we will use the Office JavaScript API to access the file as a binary string and then […]
[…] previous articles I have written about how to interact with a Word document to search and replace and even save the word document to Salesforce. Going back to a more basic level we are going […]
Thannks for the post