The following example will show you how to use the E-iceblue‘s free Spire.Doc for Java to perform mail merge operations on MS Word documents.
Create Maven Project and Add Dependencies
Create a maven project and add the following dependencies and repositories in your project’s pom.xml file.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
...
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
</project>
Create Mail Merge Template in Microsoft Word
- Create a new Word document.
- Place your cursor where you want to add a merge field.
- Click the Insert menu, Quick Parts, Fields…
- In the Field names select MergeField and enter the field name and press OK.
- To create merge field for image you need to prefix the field name with
Image: - When finished save the document.
The Mail Merge Code Snippet
The code snippet reads the mail merge template from a file called Receipt.docx. For the image we use a duke.png. Both of these files must be placed in the /src/main/resources directory in your maven project so that the code can read it.
package org.kodejava.example.spire;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.reporting.MergeImageFieldEventArgs;
import com.spire.doc.reporting.MergeImageFieldEventHandler;
import java.awt.Dimension;
import java.io.FileOutputStream;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class MailMergeExample {
public static final Locale LOCALE = new Locale("id", "ID");
public static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd-MMMM-yyyy", LOCALE);
public static final NumberFormat NUMBER_FORMAT = NumberFormat.getCurrencyInstance(LOCALE);
public static void main(String[] args) {
String[] fieldNames = new String[]{
"academicYear",
"registrationNumber",
"fullName",
"gender",
"telephone",
"address",
"paymentAmount",
"inWords",
"paymentDate",
"receivedBy",
"picture"
};
String[] fieldValues = new String[]{
"2021/2022",
"0001/REG/2021",
"Foo Bar",
"M",
"081234567890",
"Sudirman Street 100",
NUMBER_FORMAT.format(1575000),
"One Million Five Hundred Seventy Five Thousand",
DATE_FORMAT.format(new Date()),
"John Doe",
"/duke.png"
};
try {
Document document = new Document();
document.loadFromStream(MailMergeExample.class.getResourceAsStream("/Receipt.docx"), FileFormat.Auto);
document.getMailMerge().MergeImageField = new MergeImageFieldEventHandler() {
@Override
public void invoke(Object o, MergeImageFieldEventArgs field) {
field.setPictureSize(new Dimension(66, 88));
String path = field.getImageFileName();
if (path != null && !path.isEmpty()) {
try {
field.setImage(MailMergeExample.class.getResourceAsStream(path));
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
document.getMailMerge().execute(fieldNames, fieldValues);
String fileName = "Receipt.pdf";
FileOutputStream fos = new FileOutputStream(fileName);
document.saveToStream(fos, FileFormat.PDF);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Running the code will create a file called Receipt.pdf with the content as shown in the image below.




Is this support the conditional merged fields? If yes, can you please let me know how to do this? Thanks