Относительно этого поста Я много работал с Open XML Word и доступными библиотеками.Большинству неведомо то, что есть некоторые замечательные ресурсы для программной работы с форматом Open XML для Word (и я не имею в виду ручную запись XML в файловый поток!).
Мой вопрос касается того, что я делаю.По сути, я вручную создаю слияние.Теперь слияние с почтой на самом деле работает нормально, но не сработает, однако, размещение полей слияния внутри документа.Вот что я делаю:
string mergeFieldName = m.Value.Replace("[", string.Empty).Replace("]", string.Empty);
Body body = new Body();
DocumentFormat.OpenXml.Wordprocessing.Paragraph p = new DocumentFormat.OpenXml.Wordprocessing.Paragraph();
SimpleField simpleField = new SimpleField() { Instruction = " MERGEFIELD " + mergeFieldName + " " };
Run run = new Run();
RunProperties runProperties = new RunProperties();
NoProof noProof = new NoProof();
runProperties.Append(noProof);
Text text = new Text("«" + mergeFieldName + "»");
run.Append(runProperties);
run.Append(text);
simpleField.Append(run);
p.Append(simpleField);
body.Append(p);
docXml.InnerXml = docXml.InnerXml.Replace(m.Value, body.InnerXml);
Переменная m
на самом деле является Match
объектом, основанным на моем регулярном выражении, сопоставляющем все в квадратных скобках.(Вам может быть интересно, почему я делаю это так, как я - это не имеет отношения к делу)
Моя проблема в том, что полученный XML-код недействителен, потому что у меня есть следующее:
<w:p w:rsidR="00945DC1" w:rsidRDefault="006878CA">
<w:r>
<w:t xml:space="preserve">
<w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:fldSimple w:instr=" MERGEFIELD FullName ">
<w:r>
<w:rPr>
<w:noProof />
</w:rPr>
<w:t>«FullName»</w:t>
</w:r>
</w:fldSimple>
</w:p>
</w:t>
</w:r>
</w:p>
ИВот пример рабочего XML из документа, созданного вручную:
<w:p w:rsidR="001B2242" w:rsidRDefault="001B2242">
<w:r>
<w:tab/>
</w:r>
<w:fldSimple w:instr=" MERGEFIELD "SalutationName" ">
<w:r>
<w:rPr>
<w:noProof/>
</w:rPr>
<w:t>«SalutationName»</w:t>
</w:r>
</w:fldSimple>
</w:p>
Фактическая ошибка, которую я получаю: «Файл не может быть открыт, потому что есть проблемы с содержимым».Если я не выписываю поля слияния, загружаю документ, а затем вставляю поля слияния, это работает.Таким образом, фактическое слияние почты является правильным, это просто поля слияния, которые являются неправильными.(См. Мой пост о том, как заставить почту слиться).
Есть идеи по этому поводу?
Приветствия