Поиск элемента управления контентом в Word на основе тэга - PullRequest
1 голос
/ 24 февраля 2010

Сейчас я пробую что-то новое с OpenXml, но недавно я столкнулся с некоторыми проблемами. Как видно из заголовка, я пытаюсь динамически вставлять данные в таблицу с использованием Xml. Чтобы идентифицировать таблицу в моем Worddoc, я поместил элемент управления Rich Text Content вокруг него.

Все работало и выглядело нормально, пока я не попытался найти в моем документе тэг Rich Content Content Control. Я продолжаю получать « Ссылка на объект, не установленная на экземпляр объекта. » во время выполнения моего кода.

Он линия, где это происходит:

SdtBlock ccWithTable = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == t.Name).Single();

Я использовал следующий документ MSDN, чтобы попытаться достичь цели без успеха:

Вставка повторяющихся элементов данных в таблицу Word 2007 с помощью API Open Xml

Если кто-нибудь может мне помочь, я буду любить тебя долго.

1 Ответ

2 голосов
/ 24 февраля 2010

Хорошо, я создал обходной путь, который на самом деле работает даже лучше.

Сначала я извлекаю все таблицы из документа ..

List<Table> tables = mainPart.Document.Body.Descendants<Table>().ToList();

Затем я проверяю параметр тега SdtBlock, который является родителем моей таблицы, чтобы увидеть, совпадают ли они.

for (int f = 0; f < tables.Count; f++)
 {
   // If a table is found in the correct Content Control, fill it up with the data
   if (tables.ElementAt(f).Parent.Parent.GetFirstChild<SdtProperties>().GetFirstChild<Tag>().Val == t.Name)
     { //the rest of your code...

t.Name - тег содержимого, которое я хотел найти.

Я на самом деле очень рад этому результату, потому что это решает тот факт, что несколько одинаковых таблиц (в одном документе, с одинаковым тегом) не могут быть заполнены.

Небольшая заметка: Лучше всего попытаться поймать if, если в вашем документе есть другие таблицы, которые не являются динамическими.

tables.ElementAt(f).Parent.Parent.GetFirstChild<SdtProperties>().GetFirstChild<Tag>().Val 

убил бы их.

...