Делал подобную задачу на PHP, но принцип тот же.
Берете шаблон .docx, открываете его как объект класса zip.
Потом в этом архиве читаете нужный xml, и далее str_replase.
Примерный код:
//Папки Шаблона и загрузки нового файла
$template = 'templates/auditor';
$uploaddir = "documents/".$id;
//Файлы Шаблона и новый файл
$fileTemplate = $template .'/template.docx';
$newfile = $uploaddir .'/auditor_'. $num.'.docx';
//Создаём новую папку
if( !is_dir($uploaddir) ) mkdir( $uploaddir, 0755, true );
//Копируем файл
copy($fileTemplate, $newfile);
$zip = new ZipArchive;
if ($zip->open($newfile) === TRUE) {
$handle = fopen( $template ."/document.xml", "r");
$content = fread($handle, filesize($template ."/document.xml"));
fclose($handle);
$content = str_replace("{customer_r}", $auditor, $content);
$content = str_replace("{num}", $data['Statement']['num'], $content);
$zip->deleteName('word/document.xml');
$zip->addFromString('word/document.xml',$content);
$zip->close();
}else{
echo "error";
}