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