У меня есть .docx
, который включает MailMerge, мне нужно изменить его источник с помощью кода (C#). В качестве библиотеки я использую OpenXml
. Открыв docx как zip-файл и ищет пути, я обнаружил, что ссылка источника данных хранится в двух разных местах: в word/settings.xml
и в word/_rels/settings.xml.rels
.Редактировать MailMerge через OpenXml
Для замены Fisrt:
var template = new MemoryStream(myDocxInByteArray);
using (var doc = DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Open(template, true))
{
var s = doc.MainDocumentPart.DocumentSettingsPart.Settings;
foreach (var els in s.ChildElements)
{
if (els is DocumentFormat.OpenXml.Wordprocessing.MailMerge)
{
var mm = (DocumentFormat.OpenXml.Wordprocessing.MailMerge)els;
mm.Query.Val = "SELECT * FROM " + myNewPath;
break;
}
}
}
Это прекрасно работает, однако при открытии файла Слово требующего, чтобы загрузить файл с новым путем, но и от старого, так как она определена в word/_rels/settings.xml.rels
,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/mailMergeSource" Target="oldPath" TargetMode="External"/>
</Relationships>
Как я могу найти этот объект (Relation
) в WordprocessingDocument
? Не можете найти его ... Или есть другой способ его изменить?
EDIT:
Я создал два различные пустые файлы с другим источником, а затем открыть с помощью OpenXml Productivity Tool для того, чтобы сравнить их. Поскольку я уже видел различия в word/settings.xml
и в word/_rels/settings.xml.rels
.
Try открытие документа в Word, изменение источника данных, а затем сохранение его с другим именем. Используйте функцию «Сравнить» в Инструменте производительности Open XML SDK, чтобы увидеть код, который он генерирует, чтобы изменить один документ на другой. FWIW, вам, вероятно, потребуется создать новый идентификатор отношения (который будет сохранен в файле rels) и использовать его для замены/удаления rId1. Обычно это работает с Open XML SDK. –
Хорошо, но как мне удалить старые отношения? Я не могу найти его, открывая его с помощью OpenXml ... – Emaborsa