Как выполнить Mail Merge в Word с помощью Java
Слияние писем — это мощная функция Microsoft Word, позволяющая создавать персонализированные документы, такие как письма, конверты или этикетки, путем слияния основного документа с источником данных. Использование функции слияния писем позволяет экономить время и силы при массовой рассылке приглашений, информационных бюллетеней или счетов-фактур, поскольку можно настраивать содержание для каждого получателя, не набирая и не копируя его вручную несколько раз.
В этой статье я покажу, как создать шаблон, содержащий поля слияния писем, и как объединить текстовые значения и изображения в поля слияния, используя Free Spire.Doc for Java.
Установка файла Free Spire.Doc.jar
Если вы создали Maven-проект, вы можете легко импортировать jar в свое приложение, используя следующие конфигурации. Для проектов, не использующих Maven, загрузите jar-файл по этой ссылке и добавьте его в качестве зависимости в свое приложение.

Создание шаблона, содержащего поля Mail Merge, на Java
Рекомендуется создавать шаблон с помощью Microsoft Word, поскольку при ручном проектировании легче корректировать макет и общий вид в режиме реального времени. Однако если вы хотите программно вставить поля почтовой сортировки в документ Word, выполните следующие действия.
- Создайте новый пустой объект документа.
- Добавьте в документ раздел.
- Добавьте в раздел абзац.
- Добавьте в абзац поля почтовой сортировки с помощью метода Paragraph.appendField().
- Сохраните документ в файл .docx.
import com.spire.doc.Document;
import com.spire.doc.FieldType;
import com.spire.doc.FileFormat;
import com.spire.doc.Section;
import com.spire.doc.documents.BreakType;
import com.spire.doc.documents.Paragraph;
public class CreateMailMergeFields {
public static void main(String[] args) {
//Create a Document object
Document document = new Document();
//Add a section
Section section = document.addSection();
//Add a paragraph
Paragraph paragraph = section.addParagraph();
//Add text and mail merge fields to the paragraph
paragraph.appendText("Name: ");
paragraph.appendField("Name", FieldType.Field_Merge_Field);
paragraph.appendBreak(BreakType.Line_Break);
paragraph.appendText("Phone: ");
paragraph.appendField("Phone", FieldType.Field_Merge_Field);
paragraph.appendBreak(BreakType.Line_Break);
paragraph.appendText("Date: ");
paragraph.appendField("Date", FieldType.Field_Merge_Field);
paragraph.appendBreak(BreakType.Line_Break);
paragraph.appendText("Portrait: ");
paragraph.appendField("Image:Portrait", FieldType.Field_Merge_Field);
//Save the document
document.saveToFile("Template.docx", FileFormat.Docx_2013);
}
}

Слияние полей с данными
В данном примере кода загружается шаблон Word, задаются имена и значения полей слияния, выполняется операция слияния и сохраняется полученный документ в новый файл. Ниже приведены подробные шаги.
- Создайте новый экземпляр класса Document.
- Загрузите шаблон Word, созданный с помощью приведенного выше кода.
- Укажите в шаблоне имена полей слияния писем.
- Укажите текст и изображения для полей слияния писем.
- Выполните операции слияния по почте, объединив значения в полях.
- Сохраните объединенный документ в другой файл Word.
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.reporting.MergeImageFieldEventArgs;
import com.spire.doc.reporting.MergeImageFieldEventHandler;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MergeData {
public static void main(String[] args) throws Exception {
//Create a Document instance
Document document = new Document();
//Load the template
document.loadFromFile("C:\Users\Administrator\Desktop\Template.docx");
//Specify mail merge fields’ names
String[] fieldNames = new String[]{"Name«, «Phone», «Date», «Portrait»};
//Specify text values for the fields
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);
String[] fieldValues = new String[]{"John Smith«, «+1 (69) 123456», dateString, «C:\Users\Administrator\Desktop\portrait.jpg»};
//Invoke the custom method to load image
document.getMailMerge().MergeImageField = new MergeImageFieldEventHandler() {
public void invoke(Object sender, MergeImageFieldEventArgs args) {
mailMerge_MergeImageField(sender, args);
}
};
//Merge the specified values into fields
document.getMailMerge().execute(fieldNames, fieldValues);
//Save the document to file
document.saveToFile("MergeData.docx", FileFormat.Docx_2013);
}
//Create a custom method to load image for mail merge
private static void mailMerge_MergeImageField (Object sender, MergeImageFieldEventArgs field) {
String filePath = field.getImageFileName();
if (filePath != null && !"".equals(filePath)) {
try {
field.setImage(filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
