Open XML - неправильный формат - PullRequest
0 голосов
/ 27 августа 2010

Относительно этого поста Я много работал с 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 &quot;SalutationName&quot; ">
    <w:r>
      <w:rPr>
        <w:noProof/>
      </w:rPr>
      <w:t>«SalutationName»</w:t>
    </w:r>
  </w:fldSimple>
</w:p>

Фактическая ошибка, которую я получаю: «Файл не может быть открыт, потому что есть проблемы с содержимым».Если я не выписываю поля слияния, загружаю документ, а затем вставляю поля слияния, это работает.Таким образом, фактическое слияние почты является правильным, это просто поля слияния, которые являются неправильными.(См. Мой пост о том, как заставить почту слиться).

Есть идеи по этому поводу?

Приветствия

1 Ответ

0 голосов
/ 16 сентября 2010

Я вижу, что вы заменяете это неправильно.Вы помещаете новый создаваемый вами XML в тег aw: t, который является текстовым тегом. Если я не ошибаюсь

Пропустите создание Body и замените InnerXml абзаца p на innerXml m.Значения родительские.

То есть, если я правильно понимаю.

...