docx4j does not replace variables

docx4j table example
docx4js example

I just followed approach No 2 in the VariableReplace example from docx4j 2.8.1 and everything it does, is to remove the variable markers ${}.

The steps I did:

  • Opened Word 2013, typed ${variable} as text only
  • Saved it to somewhere
  • read it in my Java program and build my HashMap with .put("variable", "TEST");
  • other code is copied and pasted from the example above.
  • Saved the document

I'd expect 'TEST' solely, and get just 'variable' without the markers in the output document.

No doubt Word is splitting your "variable" across runs, with grammar or spelling flags.

Fix it up with VariablePrepare

Put this line in after you instantiate the WordprocessingMLPackage:


Then you can use your mappings to replace the variables.

OpenXML variables not replaced if all of them are not in , Hi Team, I am facing a an issue where if all of my variables in a docx document are not in same font, then few of them don't get replaced with  docx4j is licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

I realize this is an old post, but for others that stumble onto this, another reason you can get this result is if you have incorrect "keys" in your HashMap. So in my case, I was using my old xml format as the key like


when I should have been using:


The document itself was using tags like


The VariableReplace code will remove the ${} formatting whether a match is found or not. So if it is not finding a match, then the keys might not match the ones in the document for some reason, and this might not strictly be related to VariablePrepare. But this was a very helpful post for me since the VariablePrepare, VariableReplace solution is now working for my purposes.

Also, I am not sure that even VariablePrepare can handle the case where you change the font, highlighting or other formatting in the middle of your tag in the document. In such cases, it will not be able to merge the tag into a single run, and so tag recognition will likely fail.

OpenXML Replace Variables in Header and Footer? : docx4j Java , I would like to replace placeholders also in headers and footers, i don't But i could not find any example on how to use variableReplace for  See how you can use docx4j to create impressive Word document templates and learn how to counter some so they do not all fit on one page. is more than enough to replace variables with

The main reason why variables cannot be replaced is: using plain text like ${name} instead MERGEFIELD field type. Here is the link how to add MERGEFIELD into document -

Also you can use docx-stamper with SpEL -

docx4java aka docx4j – OpenXML office documents in Java » Blog , Variable replacement is quite a popular way to get started generating The friendliest OpenDoPE authoring tool is the “No-XML” Word AddIn. The template.docx file is loaded into a Docx4j internal object and prepared for the variable replacement. For replacing the variables I created a HashMap where the key is the name of the variable and the value the content. Docx4j supports three approaches for replacing variables within a .docx file: Marking variables with ${} in the document

docx4j does not replace variables - docx4j - android, I just followed approach No 2 in the VariableReplace example from docx4j 2.8.1 and everything it does, is to remove the variable markers ${}. The steps I did:  A couple of months ago I needed to create a dynamic Word document with a number of tables and paragraphs. In the past I’ve used POI for this, but I’ve found this hard to use and it doesn’t work that well for me when creating more complex documents. So for this project, after some searching around, I decided to use docx4j. Docx4j, according to their site is a:"docx4j is a Java library for, Tutorial on how to generate documents from Word templates using Docx4j on Wildfly 14 with Java. Replace variables and create simple template with Word. I am using the Docx4j library in the latest version 6.0.1 and as this library is making use of JAXB Feel free to open an issue if anything is not working as expected! There won't be any difference, since you've only changed the scope of the variables. Since you're not using the variables outside of the scope, the generated bytecode will be identical as well (you can try it out with javap). So use the second style for clarity. Edit: In fact if

Generate documents from Word templates with Docx4j on Wildfly 14, /src/main/java/org/docx4j/samples/ 2.0 (the "License"); 7 you may not use this file except in compliance with the License. Text; 42 43 44​/** 45 * There are at least 3 approaches for replacing variables in 46 * a docx. The basic text elements in a docx4j are represented by the org.docx4j.wml.Text class. To replace this simple placeholder all we have to do is call this method: though, this is also very easy

  • Provided link is 404'ed
  • This is the correct answer. I had the same problem as Martin and I spent over an hour for such a simple thing :(
  • This was a life saver!
  • Hi JasonPlutext why I'm not able to add the runs(R) inside content control using variable prepare?. Is that possible to do using that class. if yes how to do so, If not what will be your idea to do that.
  • there's a broken link to VariablePrepare - I found this one instead…