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.