Поделиться через


Создание и добавление стиля символа в документ обработки текста

В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного создания и добавления стиля символов в текстовый документ. Он содержит пример CreateAndAddCharacterStyle метода для иллюстрации этой задачи, а также дополнительный пример метода для добавления части стилей, когда это необходимо.

Метод CreateAndAddCharacterStyle

Пример CreateAndAddCharacterStyle метода можно использовать для добавления стиля в текстовый документ. Сначала необходимо получить ссылку на часть определений стилей в документе, в который вы хотите добавить стиль. Пример, в который показано, как это сделать, см. в разделе Вызов примера метода .

Метод принимает четыре параметра, указывающие: путь к файлу для изменения, идентификатор стиля (внутренний идентификатор), имя стиля (для внешнего использования в пользовательском интерфейсе) и при необходимости любые псевдонимы стиля (альтернативные имена для использования в пользовательском интерфейсе).

static void CreateAndAddCharacterStyle(string filePath, string styleid, string stylename, string aliases = "")

Полный листинг кода метода можно найти в разделе Пример кода.

Сведения об идентификаторах стилей, именах стилей и псевдонимах

Идентификатор стиля используется документом для ссылки на стиль и может рассматриваться как его основной идентификатор. Как правило, идентификатор стиля используется для идентификации стиля в коде. Стиль также может иметь отдельное отображаемое имя, отображаемое в пользовательском интерфейсе. Поэтому часто имя стиля отображается в правильном регистре и с интервалом (например, Заголовок 1), а идентификатор стиля более краткий (например, заголовок1) и предназначен для внутреннего использования. Псевдонимы указывают альтернативные имена стилей, которые можно использовать в пользовательском интерфейсе приложения.

Например, рассмотрим следующий пример кода XML, взятый из определения стиля.

    <w:style w:type="character" w:styleId="OverdueAmountChar" . . .
      <w:aliases w:val="Late Due, Late Amount" />
      <w:name w:val="Overdue Amount Char" />
    . . .
    </w:style>

Атрибут элемента styleId стиля определяет main внутренний идентификатор стиля, идентификатор стиля (OverdueAmountChar). Элемент aliases задает два альтернативных имени стилей: Late Due и Late Amount, которые разделены запятыми. Каждое имя должно быть разделено одной или несколькими запятыми. Наконец, элемент name задает имя основного стиля, которое обычно отображается в пользовательском интерфейсе приложения.

Вызов примера метода

Пример метода можно использовать CreateAndAddCharacterStyle для создания и добавления именованного стиля в текстовый документ с помощью пакета SDK Open XML. В следующем примере кода показано, как открыть и получить ссылку на текстовый документ, получить ссылку на часть определений стилей документа, а затем вызвать CreateAndAddCharacterStyle метод .

Чтобы вызвать метод, передайте ссылку на файл для редактирования в качестве первого параметра, идентификатор стиля в качестве второго параметра, имя стиля в качестве третьего параметра и при необходимости все псевдонимы стиля в качестве четвертого параметра. Например, в следующем примере кода создается символьный стиль "Overdue Amount Char" в примере файла, имя которому поступает из первого аргумента метода . Он также создает три выполнения текста в абзаце и применяет стиль ко второму выполнению.

static void AddStylesToPackage(string filePath)
{
    // Create and add the character style with the style id, style name, and
    // aliases specified.
    CreateAndAddCharacterStyle(
        filePath,
        "OverdueAmountChar",
        "Overdue Amount Char",
        "Late Due, Late Amount");

    using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
    {

        // Add a paragraph with a run with some text.
        Paragraph p = new Paragraph(
                new Run(
                    new Text("this is some text ") { Space = SpaceProcessingModeValues.Preserve }));

        // Add another run with some text.
        p.AppendChild<Run>(new Run(new Text("in a run ") { Space = SpaceProcessingModeValues.Preserve }));

        // Add another run with some text.
        p.AppendChild<Run>(new Run(new Text("in a paragraph.") { Space = SpaceProcessingModeValues.Preserve }));

        // Add the paragraph as a child element of the w:body.
        doc?.MainDocumentPart?.Document?.Body?.AppendChild(p);

        // Get a reference to the second run (indexed starting with 0).
        Run r = p.Descendants<Run>().ElementAtOrDefault(1)!;

        // If the Run has no RunProperties object, create one and get a reference to it.
        RunProperties rPr = r.RunProperties ?? r.PrependChild(new RunProperties());

        // Set the character style of the run.
        if (rPr.RunStyle is null)
        {
            rPr.RunStyle = new RunStyle();
            rPr.RunStyle.Val = "OverdueAmountChar";
        }
    }
}

Типы стилей

WordprocessingML поддерживает шесть типов стилей, четыре из которых можно указать с помощью атрибута type в элементе style. В следующих сведениях из раздела 17.7.4.17 спецификации ISO/IEC 29500 представлены типы стилей.

Типы стилей относятся к свойству стиля, которое определяет тип стиля, созданного с помощью этого определения стиля. WordprocessingML поддерживает шесть типов определений стилей по значениям атрибута типа определения стиля:

  • Стили абзацев
  • Стили символов
  • Связанные стили (абзац + символ) выполняются с помощью элемента link (§17.7.4.6).
  • Стили таблиц
  • Стили нумеровки
  • Свойства абзаца и символа по умолчанию

Рассмотрим стиль с именем Заголовок 1 в документе, как показано в следующем примере кода.

    <w:style w:type="paragraph" w:styleId="Heading1">
      <w:name w:val="heading 1"/>
      <w:basedOn w:val="Normal"/>
      <w:next w:val="Normal"/>
      <w:link w:val="Heading1Char"/>
      <w:uiPriority w:val="1"/>
      <w:qformat/>
      <w:rsid w:val="00F303CE"/>
      …
    </w:style>

Атрибут type имеет значение paragraph, указывающее, что следующее определение стиля является стилем абзаца.

Можно задать типы стилей абзацев, символов, таблиц и нумеруемых стилей, указав соответствующее значение в атрибуте type элемента стиля.

Тип стиля символа

Вы указываете символ в качестве типа стиля, задав для атрибута type в элементе style значение "character".

В разделе 17.7.9 спецификации ISO/IEC 29500 рассматриваются стили символов. Имейте в виду, что номера разделов, предшествующие §, указывают разделы в спецификации ISO.

17.7.9. Стили запуска (символы)

Стили символов — это стили, которые применяются к содержимому одного или нескольких фрагментов текста в содержимом документа. Это определение подразумевает, что стиль может определять только свойства символов (свойства, которые применяются к тексту в абзаце), так как он не может применяться к абзацам. На стили символов могут ссылаться только запуски в документе, и на них должен ссылаться rStyle элемент в элементе свойств выполнения выполнения.

Стиль символов имеет две определяющие типовые характеристики стиля:

  • Атрибут type в стиле имеет значение символа, указывающее, что следующее определение стиля является стилем символа.

  • Стиль задает только свойства уровня символов rPr с помощью элемента . В этом случае свойства выполнения представляют собой набор свойств, применяемых к каждому выполнению этого стиля.

Стиль символов затем применяется к запускам путем ссылки на styleId значение атрибута для этого стиля в элементе свойств rStyle выполнения.

На следующем рисунке показан текст, к которому применен стиль символов. Стиль символов может применяться только к диапазону текста на уровне вложенных абзацей.

Рис. 1. Текст с примененным стилем символов

Стиль символов, применяемый к некоторому тексту

Принципы работы кода

Метод CreateAndAddCharacterStyle начинается с открытия указанного файла и получения ссылки на элемент styles в части стилей. Элемент styles является корневым элементом части и содержит все отдельные элементы стиля. Если ссылка имеет значение NULL, элемент styles создается и сохраняется в части .

using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(filePath, true))
{
    // Get access to the root element of the styles part.
    Styles? styles = wordprocessingDocument?.MainDocumentPart?.StyleDefinitionsPart?.Styles ?? AddStylesPartToPackage(wordprocessingDocument).Styles;

Создание стиля

Чтобы создать стиль, код создает Style экземпляр класса и задает определенные свойства, такие как Type стиль (абзац), StyleIdи указывает, является ли стиль .CustomStyle

// Create a new character style and specify some of the attributes.
Style style = new Style()
{
    Type = StyleValues.Character,
    StyleId = styleid,
    CustomStyle = true
};

Код приводит к следующему XML-коду.

    <w:style w:type="character" w:styleId="OverdueAmountChar" w:customStyle="true" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
    </w:style>

Далее код создает дочерние элементы стиля, которые определяют свойства стиля. Чтобы создать элемент, создайте экземпляр соответствующего класса, а затем вызовите Append метод , чтобы добавить дочерний элемент в стиль. Дополнительные сведения об этих свойствах см. в разделе 17.7 спецификации ISO/IEC 29500 .

// Create and add the child elements (properties of the style).
Aliases aliases1 = new Aliases() { Val = aliases };
StyleName styleName1 = new StyleName() { Val = stylename };
LinkedStyle linkedStyle1 = new LinkedStyle() { Val = "OverdueAmountPara" };

if (!String.IsNullOrEmpty(aliases))
{
    style.Append(aliases1);
}

style.Append(styleName1);
style.Append(linkedStyle1);

Затем код создает StyleRunProperties экземпляр объекта для создания rPr элемента (Свойства выполнения). В этом элементе указываются свойства символов, которые применяются к стилю, например шрифт и цвет. Затем свойства добавляются как дочерние rPr элементы элемента .

При создании свойств выполнения код добавляет rPr элемент к стилю, а элемент style — к корневому элементу styles в части стилей.

// Create the StyleRunProperties object and specify some of the run properties.
StyleRunProperties styleRunProperties1 = new StyleRunProperties();
Bold bold1 = new Bold();
Color color1 = new Color() { ThemeColor = ThemeColorValues.Accent2 };
RunFonts font1 = new RunFonts() { Ascii = "Tahoma" };
Italic italic1 = new Italic();
// Specify a 24 point size.
FontSize fontSize1 = new FontSize() { Val = "48" };
styleRunProperties1.Append(font1);
styleRunProperties1.Append(fontSize1);
styleRunProperties1.Append(color1);
styleRunProperties1.Append(bold1);
styleRunProperties1.Append(italic1);

// Add the run properties to the style.
style.Append(styleRunProperties1);

// Add the style to the styles part.
styles.Append(style);

В следующем XML-коде показан окончательный стиль, созданный приведенным здесь кодом.

    <w:style w:type="character" w:styleId="OverdueAmountChar" w:customStyle="true" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:aliases w:val="Late Due, Late Amount" />
      <w:name w:val="Overdue Amount Char" />
      <w:link w:val="OverdueAmountPara" />
      <w:rPr>
        <w:rFonts w:ascii="Tahoma" />
        <w:sz w:val="48" />
        <w:color w:themeColor="accent2" />
        <w:b />
        <w:i />
      </w:rPr>
    </w:style>

Применение стиля символа

После создания стиля его можно применить к выполнению, указав значение атрибута styleId для этого стиля в элементе свойств rStyle выполнения. В следующем примере кода показано, как применить стиль к выполнению, на который ссылается переменная r. Идентификатор стиля, который требуется применить, OverdueAmountChar в этом примере, хранится в свойстве rPr RunStyle объекта . Это свойство представляет элемент свойств rStyle выполнения.

// If the Run has no RunProperties object, create one and get a reference to it.
RunProperties rPr = r.RunProperties ?? r.PrependChild(new RunProperties());

// Set the character style of the run.
if (rPr.RunStyle is null)
{
    rPr.RunStyle = new RunStyle();
    rPr.RunStyle.Val = "OverdueAmountChar";
}

Пример кода

Ниже приведен полный CreateAndAddCharacterStyle пример кода в C# и Visual Basic.

// Create a new character style with the specified style id, style name and aliases and 
// add it to the specified file.
static void CreateAndAddCharacterStyle(string filePath, string styleid, string stylename, string aliases = "")
{
    using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(filePath, true))
    {
        // Get access to the root element of the styles part.
        Styles? styles = wordprocessingDocument?.MainDocumentPart?.StyleDefinitionsPart?.Styles ?? AddStylesPartToPackage(wordprocessingDocument).Styles;

        if (styles is not null)
        {
            // Create a new character style and specify some of the attributes.
            Style style = new Style()
            {
                Type = StyleValues.Character,
                StyleId = styleid,
                CustomStyle = true
            };

            // Create and add the child elements (properties of the style).
            Aliases aliases1 = new Aliases() { Val = aliases };
            StyleName styleName1 = new StyleName() { Val = stylename };
            LinkedStyle linkedStyle1 = new LinkedStyle() { Val = "OverdueAmountPara" };

            if (!String.IsNullOrEmpty(aliases))
            {
                style.Append(aliases1);
            }

            style.Append(styleName1);
            style.Append(linkedStyle1);

            // Create the StyleRunProperties object and specify some of the run properties.
            StyleRunProperties styleRunProperties1 = new StyleRunProperties();
            Bold bold1 = new Bold();
            Color color1 = new Color() { ThemeColor = ThemeColorValues.Accent2 };
            RunFonts font1 = new RunFonts() { Ascii = "Tahoma" };
            Italic italic1 = new Italic();
            // Specify a 24 point size.
            FontSize fontSize1 = new FontSize() { Val = "48" };
            styleRunProperties1.Append(font1);
            styleRunProperties1.Append(fontSize1);
            styleRunProperties1.Append(color1);
            styleRunProperties1.Append(bold1);
            styleRunProperties1.Append(italic1);

            // Add the run properties to the style.
            style.Append(styleRunProperties1);

            // Add the style to the styles part.
            styles.Append(style);
        }
    }
}

// Add a StylesDefinitionsPart to the document.  Returns a reference to it.
static StyleDefinitionsPart AddStylesPartToPackage(WordprocessingDocument? doc)
{
    StyleDefinitionsPart part;

    if (doc?.MainDocumentPart is null)
    {
        throw new ArgumentNullException("MainDocumentPart is null.");
    }

    part = doc.MainDocumentPart.AddNewPart<StyleDefinitionsPart>();
    Styles root = new Styles();

    return part;
}

См. также

Как применить стиль к абзацу в текстовом документе

Справочник по библиотеке классов пакета SDK Open XML