Ошибка таблицы OpenXml " элементы требуются перед каждым "
Я создал шаблон Word, который затем обрабатываю с помощью OpenXML SDK, чтобы заменить часть содержимого документа данными из запроса базы данных.
шаблон состоит из некоторого базового текста с элементами управления содержимым обычного текста, введенными в местах, которые я хочу заменить текст. Затем я использую текст в этих элементах управления в качестве ключа для поиска значений замены. В большинстве случаев это работает нормально (я просто обновляю свойство Text текста объект.)
в одном случае я заменяю текст таблицей. В этом случае я создаю таблицу в коде, а затем заменяю содержимое объекта SdtContentRun (родитель объекта Run, который, в свою очередь, является родителем текстового объекта) новым объектом Table...
var sdtContentRunElements =
from sdtContentRun in this.Document.MainDocumentPart.RootElement.Descendants<SdtContentRun>()
select sdtContentRun;
sdtContentRunElements.ForEach(sdtContentRunElement => {
Run firstRunElement = sdtContentRunElement.Descendants<Run>().FirstOrDefault();
if (firstRunElement != null) {
Text firstTextElement = firstRunElement.Descendants<Text>().FirstOrDefault();
if (firstTextElement != null) {
switch (firstTextElement.Text) {
case TableBookmark:
Table advisoryTable = new Table(...); // See below
OpenXmlElement parent = firstRunElement.Parent;
parent.RemoveAllChildren();
parent.Append(advisoryTable);
break;
case ContractorItemAdvisoriesLetter.ContractorCodeBookmark:
firstTextElement.Text = @"New text";
break;
}
}
}
}
}
это приводит к следующему XML (взято из Open XML SDK 2.0 Productivity Tool для Microsoft Office)...
<w:sdtContent xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:tbl>
<w:tr>
<w:tc>
<w:p>
<w:r>
<w:t>Lorem ipsum dolor sit amet</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
</w:sdtContent>
(некоторые из содержания таблица была удалена, поскольку я чувствовал, что это просто затуманит проблему)
когда я пытаюсь открыть документ в Word появляется сообщение об ошибке. Об ошибках сообщается это...
Амбугуусное сопоставление клеток. Возможный пропущенный пункт элемент. элементы необходимы перед каждым
вероятно, стоит упомянуть, что при просмотре проводника документов в Open XML SDK 2.0 Productivity Tool для Microsoft Office, w: tbl элемент (и все элементы, содержащиеся внутри) распознаются как OpenXmlUnknownElement
вместо того, чтобы быть признанным Table
объекты. Я не знаю, актуально ли это или это причуда инструмента SDK.
явно я что-то упускаю. Насколько я могу судить по определение класса таблицы, совершенно законно разместить w:tbl внутри w: sdtContent (если я не читаю это неправильно), поэтому я сейчас в недоумении относительно того, что может быть проблемой. Есть также очень несколько результатов, если вы google "таблица" и "OpenXmlUnknownElement", ни один из результатов не связан с моей проблемой.
какие предложения?
EDIT: дальнейшее исследование, похоже, указывает на то, что проблема на самом деле заключается во внедрении другой таблицы в одну из ячеек таблицы, добавляемой выше. Новый объект таблицы добавляется непосредственно к объекту TableCell, который, согласно документации для таблицы, указанной выше, должен быть допустимый...
Table advisoryTable = new Table();
advisories.ForEach(advisory => {
advisoryTable.Append(new TableRow(new TableCell(new Paragraph(new Run(new Text(advisory.NoteText))))));
advisory.ItemAdvisories.ForEach(itemAdvisory => {
Item item = itemAdvisory.Item;
Table itemTable = new Table();
itemTable.Append(new TableRow[] {
new TableRow(new TableCell[] {
new TableCell(new Paragraph(new Run(new Text(string.Format(@"Item {0}", item.Sequence)))))
})
});
advisoryTable.Append(new TableRow(new TableCell(itemTable)));
});
});
результате...
<w:tbl xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:tr>
<w:tc>
<w:p>
<w:r>
<w:t>Lorem ipsum dolor sit amet</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:tbl>
<w:tr>
<w:tc>
<w:p>
<w:r>
<w:t>Item 1</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
</w:tc>
</w:tr>
</w:tbl>
Я попытался добавить абзац между TableCell и встроенной таблицей, но это просто приводит к новой ошибке, на этот раз "неопределенная ошибка".
1 ответов
сортировка. Исходное сообщение об ошибке не могло быть более ясным!
последним дочерним элементом ячейки таблицы должен быть абзац. Просто добавив пустой абзац после того, как встроенная таблица решила проблему...
advisoryTable.Append(new TableRow(new TableCell(itemTable, new Paragraph())));
в конце концов я обнаружил это, создав документ в Word-2010, который состоял из таблицы в таблице, а затем посмотрел на полученный XML в том же инструменте производительности Open XML SDK 2.0 для Microsoft Office tool, который используется выше.