Слово VSTO - почему иногда не хватает paraId - PullRequest
0 голосов
/ 02 мая 2018

Я получаю названия стилей абзаца из openXML и использую свойство paraID, чтобы получить правильное.

Во время тестирования я заметил, что в зависимости от слова документа атрибут может отсутствовать ни в одном из абзацев.

Я знаю, что это внутренний идентификатор абзаца времени выполнения для Word.

Итак, вопрос в следующем: Что генерирует свойства paraId для абзацев, похоже, не может понять это.

пс. Я не хочу использовать get_style (), так как это слишком медленно ...

edit: добавлен пример кода

В некоторых документах это "0", а в некоторых документах допустимый шестнадцатеричный идентификатор

string sParaId = range.Paragraphs.First.ParaID.ToString("x").ToUpper();

Этот открытый XML-документ иногда имеет действительный атрибут w14: paraId, а иногда его и нет:

activeDocument = Globals.ThisAddIn.Application.ActiveDocument;
wordXML = XElement.Parse(activeDocument.WordOpenXML);

... Я хотел бы получить styleName примерно так из WordOpenXML, но сейчас мне кажется, что я мог бы пойти на какой-то другой вариант, так как я не знаю, когда в XML добавлен paraId.

paraEl = ooXMLElementList.Descendants().Where(x => x.Name.LocalName == 
"p").FirstOrDefault(x => x.Attribute(w14 + "paraId")?.Value == sParaId);

styleName = paraEl.Descendants().FirstOrDefault(x => x.Name.LocalName == 
"pStyle") != null ? paraEl.Descendants().FirstOrDefault(x => 
x.Name.LocalName == "pStyle").Attribute(w + "val").Value : "Normal";

1 Ответ

0 голосов
/ 02 мая 2018

Из справочника по языку слов для Paragraph.ID :

Возвращает или устанавливает идентификационную метку для указанного объекта, когда текущий документ сохраняется как веб-страница.

Поскольку документ не сохраняется как HTML, свойство не имеет значения.

Свойство ParaId не предоставляется разработчикам для использования. Он не виден в объектной модели VBA, но из-за способа генерации PIA (первичных сборок взаимодействия) разработчик .NET увидит это. Из справочника языка:

Зарезервировано для внутреннего использования.

Не уверен, что вы на самом деле пытаетесь сделать, но вы можете использовать возможность Word Range.Find для поиска форматирования (стилей).

...