Создание и добавление стиля символа в документ обработки текста
В этом разделе показано, как использовать классы в пакете 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;
}