Как задать стиль через OpenXML?

457
08 февраля 2017, 22:07

У меня есть шаблон docx с метками, которые я заменяю html-кодом.

Например вместо метки [summary] я вставляю такой html-код: <p>test paragraph</p>

Делаю я это так:

...
var htmlAsUtf8Bytes = Encoding.Default.GetBytes(replaceText);
string partId = "id_" + random.Next();
AlternativeFormatImportPart formatImportPart = mainDocumentPart.AddAlternativeFormatImportPart(
                    AlternativeFormatImportPartType.Html, partId);
formatImportPart.FeedData(new MemoryStream(htmlAsUtf8Bytes));
AltChunk altChunk = new AltChunk { Id = partId };
paragraph.InsertBeforeSelf(altChunk);
                paragraph.Remove();
...

Все работает. Но когда открываешь файл в MS Word, то к замененным частям документа не применяются стили (такие как: Обычный, Заголовок, Строгий, Без интервала и т.д.) Хотя в остальных частях документа (которые не заменялись) стиль - Обычный.

Я отображаю этот документ в HTML5 Document Viewer Control - Gnostice

Части, к которым не был применен стиль вообще не отображаются в этом редакторе. Если вручную задать стили через MS Word то редактор их отображает.

Как с помощью OpenXML задавать стили к вставляемому html?

[edit]

Пытаюсь сделать так:

StyleDefinitionsPart part = mainDocumentPart.StyleDefinitionsPart;
                DocumentFormat.OpenXml.Wordprocessing.Style style = new DocumentFormat.OpenXml.Wordprocessing.Style()
                {
                    Type = StyleValues.Paragraph,
                    StyleId = "Heading1",
                    BasedOn = new BasedOn() { Val = "Normal" },
                    NextParagraphStyle = new NextParagraphStyle() { Val = "Normal" }
                };
                StyleName styleName1 = new StyleName() { Val = "heading 1" };
                style.Append(styleName1);
                style.Append(new PrimaryStyle());
                StyleRunProperties styleRunProperties1 = new StyleRunProperties();
                styleRunProperties1.Append(new DocumentFormat.OpenXml.Wordprocessing.Bold());
                styleRunProperties1.Append(new RunFonts()
                {
                    ComplexScriptTheme = ThemeFontValues.MajorBidi,
                    HighAnsiTheme = ThemeFontValues.MajorHighAnsi,
                    EastAsiaTheme = ThemeFontValues.MajorEastAsia,
                    AsciiTheme = ThemeFontValues.MajorAscii
                });
                styleRunProperties1.Append(new DocumentFormat.OpenXml.Wordprocessing.FontSize() { Val = "28" });
                styleRunProperties1.Color = new DocumentFormat.OpenXml.Wordprocessing.Color()
                {
                    Val = "365F91",
                    ThemeShade = "BF",
                    ThemeColor = ThemeColorValues.Accent1
                };
                style.Append(styleRunProperties1);
                part.Styles.Append(style);

                ParagraphProperties pPr = new ParagraphProperties();
                ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId() { Val = "Heading1" };
                pPr.Append(paragraphStyleId1);

Потом так:

paragraph.Append(pPr);
paragraph.InsertBeforeSelf(altChunk);
paragraph.Remove();

Но на InsertBeforeSelf происходит исключение:

Additional information: Cannot insert the OpenXmlElement "newChild" because it is part of a tree.

READ ALSO
создать объект с вложенными классами

создать объект с вложенными классами

Мне надо в одном списке хранить как общие параметры, так и пользовательские параметрыДля этого я использую вложенные классы

302
Сериализация double в JSON

Сериализация double в JSON

У класса есть свойство типа double, как задать, чтобы оно сериализовалось с конкретным количеством знаков после запятой?

414
ReSharper и VS: страдает перерисовка интерфейса

ReSharper и VS: страдает перерисовка интерфейса

Подлагивает интерфейс Visual Studio с установленным R#

299
Yii2, выборка записей с предпоследней

Yii2, выборка записей с предпоследней

Добрый день! Подскажите, пожалуйста, как решить такую задачу, мне нужно выводить записи в ListView начиная с предпоследней опубликованной, последнюю...

415