Как сохранить текущий стиль при вставке через OpenXML SDK? - PullRequest
4 голосов
/ 30 марта 2011

У меня есть документ docx, который я хочу изменить с помощью OpenXML SDK. Этот документ имеет таблицу с закладками в ячейках. Ячейки имеют определенные настройки шрифта, скажем, это Times New Roman, 14pt. Когда я пытаюсь вставить текст, подобный этому:

    public void ReplaceBookmark(string bookMarkName, string text)
    {
        var bookmarkStart =
            _document.MainDocumentPart.RootElement.Descendants<BookmarkStart>()
        .Where(p => p.Name == bookMarkName)
        .FirstOrDefault();
        if (bookmarkStart == null)
            return;

        bookmarkStart.InsertAfterSelf(new Run(new Text(text)));            
    }

текст вставлен, но его стиль установлен Calibri, 11pt (стиль по умолчанию). Как вставить текст, чтобы сохранить настройки шрифта? Важно то, что я не должен определять какие-либо настройки стиля в коде, а вместо этого использовать настройки исходного документа.

Спасибо.

1 Ответ

1 голос
/ 18 июля 2011

Я немного изучил формат файла docx.Очевидно, я не могу говорить конкретно о файле, который вы используете ... но я подумал, что вас может заинтересовать то, что я нашел.

Если вы создаете копию файла docx и даете ей расширение .zipЗатем вы можете извлечь содержимое документа.В моем случае, и, вероятно, в вашем, основная часть документа находится в извлеченном файле [Extraction Base Path]\word\document.xml.

Следующий фрагмент кода XML, который применяется к первой ячейке таблицы (для документа, который я создал):

<w:tc>
    <w:tcPr>
        <w:tcW w:w="3192" w:type="dxa"/>
    </w:tcPr>
    <w:p w:rsidR="006C4430" w:rsidRPr="006C4430" w:rsidRDefault="006C4430">
        <w:pPr>
            <w:rPr>
                <w:rFonts w:ascii="Ariel" w:hAnsi="Ariel"/>
                <w:sz w:val="28"/>
                <w:szCs w:val="28"/>
            </w:rPr>
        </w:pPr>
        <w:bookmarkStart w:id="0" w:name="First"/>
        <w:bookmarkEnd w:id="0"/>
        <w:r w:rsidRPr="006C4430">
            <w:rPr>
                <w:rFonts w:ascii="Bauhaus 93" w:hAnsi="Bauhaus 93"/>
                <w:sz w:val="28"/>
                <w:szCs w:val="28"/>
            </w:rPr>
            <w:t>Here is some text</w:t>
        </w:r>
    </w:p>
</w:tc>

Как видите, теги w:bookmarkStart и w:bookmarkEnd находятся вне фактического содержимого таблицы (которое выглядит как тег w: r после закладки).Это произошло, хотя я выбрал все содержимое ячейки перед созданием закладки.В результате я подозреваю, что при любом вызове bookmarkStart.InsertAfterSelf, как вы видели, будут использоваться настройки шрифта по умолчанию, а не какие-либо настройки, связанные с ячейкой таблицы.Мне кажется, что вам нужно было бы либо перейти к циклу сразу после закладки, и вставить туда свой текст, либо скопировать настройки (предположительно содержимое тега w:rPr) из следующего цикла в новый цикл, которыйВы создаете.

Надеюсь, это укажет вам правильное направление.Удачи!

...