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


Создать и добавить стиль абзаца в текстовый документ

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


Метод CreateAndAddParagraphStyle

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

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

static void CreateAndAddParagraphStyle(StyleDefinitionsPart styleDefinitionsPart, string styleid, string stylename, string aliases = "")

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


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

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

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

    <w:style w:type="paragraph" w:styleId="OverdueAmountPara" . . .>
      <w:aliases w:val="Late Due, Late Amount" />
      <w:name w:val="Overdue Amount Para" />
    . . .
    </w:style>

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


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

Используйте метод примера CreateAndAddParagraphStyle , чтобы создать и добавить именованный стиль в документ word с помощью пакета SDK Open XML. В следующем примере кода показано, как открыть и получить ссылку на текстовый документ, получить ссылку на часть определений стилей документа, а затем вызвать CreateAndAddParagraphStyle метод .

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

string strDoc = args[0];

using (WordprocessingDocument doc = WordprocessingDocument.Open(strDoc, true))
{
    if (doc is null)
    {
        throw new ArgumentNullException("document could not be opened");
    }

    MainDocumentPart mainDocumentPart = doc.MainDocumentPart ?? doc.AddMainDocumentPart();

    // Get the Styles part for this document.
    StyleDefinitionsPart? part = mainDocumentPart.StyleDefinitionsPart;

    // If the Styles part does not exist, add it and then add the style.
    if (part is null)
    {
        part = AddStylesPartToPackage(doc);
    }

    // Set up a variable to hold the style ID.
    string parastyleid = "OverdueAmountPara";

    // Create and add a paragraph style to the specified styles part 
    // with the specified style ID, style name and aliases.
    CreateAndAddParagraphStyle(part, parastyleid, "Overdue Amount Para", "Late Due, Late Amount");

    // Add a paragraph with a run and some text.
    Paragraph p =
        new Paragraph(
            new Run(
                new Text("This is some text in a run in a paragraph.")));

    // Add the paragraph as a child element of the w:body element.
    mainDocumentPart.Document ??= new Document();
    mainDocumentPart.Document.Body ??= new Body();

    mainDocumentPart.Document.Body.AppendChild(p);

    // If the paragraph has no ParagraphProperties object, create one.
    if (p.Elements<ParagraphProperties>().Count() == 0)
    {
        p.PrependChild(new ParagraphProperties());
    }

    // Get a reference to the ParagraphProperties object.
    p.ParagraphProperties ??= new ParagraphProperties();
    ParagraphProperties pPr = p.ParagraphProperties;

    // If a ParagraphStyleId object doesn't exist, create one.
    pPr.ParagraphStyleId ??= new ParagraphStyleId();

    // Set the style of the paragraph.
    pPr.ParagraphStyleId.Val = parastyleid;
}

Типы стилей

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, указывающее, что следующее определение стиля является стилем абзаца.

© ISO/IEC 29500: 2016

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


Тип стиля абзаца

Укажите абзац в качестве типа стиля, задав для атрибута type в элементе style значение "paragraph".

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

17.7.8 Стили абзацев

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

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

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

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

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

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

© ISO/IEC 29500: 2016


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

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

// Access the root element of the styles part.
Styles? styles = styleDefinitionsPart.Styles;

if (styles is null)
{
    styleDefinitionsPart.Styles = new Styles();
    styles = styleDefinitionsPart.Styles;
}

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

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

// Create a new paragraph style element and specify some of the attributes.
Style style = new Style()
{
    Type = StyleValues.Paragraph,
    StyleId = styleid,
    CustomStyle = true,
    Default = false
};

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

    <w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:style w:type="paragraph" w:styleId="OverdueAmountPara" w:default="false" w:customStyle="true">
      </w:style>
    </w:styles>

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

// Create and add the child elements (properties of the style).
Aliases aliases1 = new Aliases() { Val = aliases };
AutoRedefine autoredefine1 = new AutoRedefine() { Val = OnOffOnlyValues.Off };
BasedOn basedon1 = new BasedOn() { Val = "Normal" };
LinkedStyle linkedStyle1 = new LinkedStyle() { Val = "OverdueAmountChar" };
Locked locked1 = new Locked() { Val = OnOffOnlyValues.Off };
PrimaryStyle primarystyle1 = new PrimaryStyle() { Val = OnOffOnlyValues.On };
StyleHidden stylehidden1 = new StyleHidden() { Val = OnOffOnlyValues.Off };
SemiHidden semihidden1 = new SemiHidden() { Val = OnOffOnlyValues.Off };
StyleName styleName1 = new StyleName() { Val = stylename };
NextParagraphStyle nextParagraphStyle1 = new NextParagraphStyle() { Val = "Normal" };
UIPriority uipriority1 = new UIPriority() { Val = 1 };
UnhideWhenUsed unhidewhenused1 = new UnhideWhenUsed() { Val = OnOffOnlyValues.On };

if (string.IsNullOrWhiteSpace(aliases))
{
    style.Append(aliases1);
}

style.Append(autoredefine1);
style.Append(basedon1);
style.Append(linkedStyle1);
style.Append(locked1);
style.Append(primarystyle1);
style.Append(stylehidden1);
style.Append(semihidden1);
style.Append(styleName1);
style.Append(nextParagraphStyle1);
style.Append(uipriority1);
style.Append(unhidewhenused1);

Затем код создает 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 = "Lucida Console" };
Italic italic1 = new Italic();

// Specify a 12 point size.
FontSize fontSize1 = new FontSize() { Val = "24" };
styleRunProperties1.Append(bold1);
styleRunProperties1.Append(color1);
styleRunProperties1.Append(font1);
styleRunProperties1.Append(fontSize1);
styleRunProperties1.Append(italic1);

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

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

Применение стиля абзаца

Если вы создали стиль, его можно применить к абзацу, ссылаясь на значение атрибута styleId для этого стиля в элементе pStyle свойств абзаца. В следующем примере кода показано, как применить стиль к абзацу, на который ссылается переменная p. Идентификатор стиля применяемого стиля хранится в переменной parastyleid, а свойство ParagraphStyleId представляет элемент свойств абзаца pStyle .

// If the paragraph has no ParagraphProperties object, create one.
if (p.Elements<ParagraphProperties>().Count() == 0)
{
    p.PrependChild(new ParagraphProperties());
}

// Get a reference to the ParagraphProperties object.
p.ParagraphProperties ??= new ParagraphProperties();
ParagraphProperties pPr = p.ParagraphProperties;

// If a ParagraphStyleId object doesn't exist, create one.
pPr.ParagraphStyleId ??= new ParagraphStyleId();

// Set the style of the paragraph.
pPr.ParagraphStyleId.Val = parastyleid;

Пример кода

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

// Create a new paragraph style with the specified style ID, primary style name, and aliases and 
// add it to the specified style definitions part.
static void CreateAndAddParagraphStyle(StyleDefinitionsPart styleDefinitionsPart, string styleid, string stylename, string aliases = "")
{
    // Access the root element of the styles part.
    Styles? styles = styleDefinitionsPart.Styles;

    if (styles is null)
    {
        styleDefinitionsPart.Styles = new Styles();
        styles = styleDefinitionsPart.Styles;
    }

    // Create a new paragraph style element and specify some of the attributes.
    Style style = new Style()
    {
        Type = StyleValues.Paragraph,
        StyleId = styleid,
        CustomStyle = true,
        Default = false
    };

    // Create and add the child elements (properties of the style).
    Aliases aliases1 = new Aliases() { Val = aliases };
    AutoRedefine autoredefine1 = new AutoRedefine() { Val = OnOffOnlyValues.Off };
    BasedOn basedon1 = new BasedOn() { Val = "Normal" };
    LinkedStyle linkedStyle1 = new LinkedStyle() { Val = "OverdueAmountChar" };
    Locked locked1 = new Locked() { Val = OnOffOnlyValues.Off };
    PrimaryStyle primarystyle1 = new PrimaryStyle() { Val = OnOffOnlyValues.On };
    StyleHidden stylehidden1 = new StyleHidden() { Val = OnOffOnlyValues.Off };
    SemiHidden semihidden1 = new SemiHidden() { Val = OnOffOnlyValues.Off };
    StyleName styleName1 = new StyleName() { Val = stylename };
    NextParagraphStyle nextParagraphStyle1 = new NextParagraphStyle() { Val = "Normal" };
    UIPriority uipriority1 = new UIPriority() { Val = 1 };
    UnhideWhenUsed unhidewhenused1 = new UnhideWhenUsed() { Val = OnOffOnlyValues.On };

    if (string.IsNullOrWhiteSpace(aliases))
    {
        style.Append(aliases1);
    }

    style.Append(autoredefine1);
    style.Append(basedon1);
    style.Append(linkedStyle1);
    style.Append(locked1);
    style.Append(primarystyle1);
    style.Append(stylehidden1);
    style.Append(semihidden1);
    style.Append(styleName1);
    style.Append(nextParagraphStyle1);
    style.Append(uipriority1);
    style.Append(unhidewhenused1);

    // 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 = "Lucida Console" };
    Italic italic1 = new Italic();

    // Specify a 12 point size.
    FontSize fontSize1 = new FontSize() { Val = "24" };
    styleRunProperties1.Append(bold1);
    styleRunProperties1.Append(color1);
    styleRunProperties1.Append(font1);
    styleRunProperties1.Append(fontSize1);
    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>();
    part.Styles = new Styles();

    return part;
}

string strDoc = args[0];

using (WordprocessingDocument doc = WordprocessingDocument.Open(strDoc, true))
{
    if (doc is null)
    {
        throw new ArgumentNullException("document could not be opened");
    }

    MainDocumentPart mainDocumentPart = doc.MainDocumentPart ?? doc.AddMainDocumentPart();

    // Get the Styles part for this document.
    StyleDefinitionsPart? part = mainDocumentPart.StyleDefinitionsPart;

    // If the Styles part does not exist, add it and then add the style.
    if (part is null)
    {
        part = AddStylesPartToPackage(doc);
    }

    // Set up a variable to hold the style ID.
    string parastyleid = "OverdueAmountPara";

    // Create and add a paragraph style to the specified styles part 
    // with the specified style ID, style name and aliases.
    CreateAndAddParagraphStyle(part, parastyleid, "Overdue Amount Para", "Late Due, Late Amount");

    // Add a paragraph with a run and some text.
    Paragraph p =
        new Paragraph(
            new Run(
                new Text("This is some text in a run in a paragraph.")));

    // Add the paragraph as a child element of the w:body element.
    mainDocumentPart.Document ??= new Document();
    mainDocumentPart.Document.Body ??= new Body();

    mainDocumentPart.Document.Body.AppendChild(p);

    // If the paragraph has no ParagraphProperties object, create one.
    if (p.Elements<ParagraphProperties>().Count() == 0)
    {
        p.PrependChild(new ParagraphProperties());
    }

    // Get a reference to the ParagraphProperties object.
    p.ParagraphProperties ??= new ParagraphProperties();
    ParagraphProperties pPr = p.ParagraphProperties;

    // If a ParagraphStyleId object doesn't exist, create one.
    pPr.ParagraphStyleId ??= new ParagraphStyleId();

    // Set the style of the paragraph.
    pPr.ParagraphStyleId.Val = parastyleid;
}

См. также