Я получаю имена стилей абзацев из openXML и использую свойство paraID, чтобы получить правильный.
Во время тестирования я заметил, что в зависимости от слова «документ» атрибут может отсутствовать ни в одном из абзацев.
Я знаю, что это внутренний идентификатор абзаца среды выполнения для Word.
Итак вопрос: То, что генерирует свойства paraId в абзацах, не может понять этого.
пс. Я не хочу использовать get_style (), потому что это слишком медленно ...
изменить: добавлен пример кода
This is in some documents "0" and in some documents a valid hex id
string sParaId = range.Paragraphs.First.ParaID.ToString("x").ToUpper();
This open xml document sometimes have valid w14:paraId-attribute and sometimes it is missing:
activeDocument = Globals.ThisAddIn.Application.ActiveDocument;
wordXML = XElement.Parse(activeDocument.WordOpenXML);
... Я хотел бы получить что-то подобное styleName из WordOpenXML, но сейчас кажется, что я мог бы выбрать другой вариант, так как я не знаю, когда paraId добавлен в XML.
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";
Из справочника по языку Word для Paragraph.ID:
Returns or sets the identifying label for the specified object when the current document is saved as a Web page.
Поскольку документ не сохраняется в формате HTML, свойство не имеет значения.
ParaId
недвижимость не предоставляется разработчикам. Он не отображается в объектной модели VBA, но из-за способа создания PIA (основных сборок взаимодействия) разработчик .NET увидит его. Из справочника по языку:
Reserved for internal use.
Не уверен, что вы действительно пытаетесь сделать, но вы можете использовать функцию Word Range.Find для поиска форматирования (стилей).
@TeemuEronen См. Информацию, которую я добавил в ответ. Это не предназначено для вас.
Добавил некоторую информацию о том, что я пытался здесь сделать. Можете ли вы привести пример того, как получить стиль с помощью range.Find? Как там производительность?
Пожалуйста, задайте это как новый вопрос, поскольку это не то, о чем был ваш исходный вопрос (почему ParaId иногда отсутствует). Этот сайт имеет формат «Вопросы и ответы» и не работает так же, как «форум». По той же причине, если вы чувствуете, что здесь есть какой-либо ответ на этот исходный вопрос, вы должны щелкнуть галочку рядом с ним. Все, что вы считаете полезным, может быть проголосовано за (как только Stack Overflow позволит вам это сделать).
Я пытаюсь получить имя стиля из диапазона или абзаца с помощью paraid, но в некоторых документах оно есть в абзацах, а в некоторых - нет. Я говорю не о paragraph.id, а о msdn.microsoft.com/en-us/library/office/…. Например range.Paragraphs.First.ParaID.ToString ("x"). ToUpper (); Как я могу использовать range.find для получения имени стиля?