Erstellen und Hinzufügen einer Absatzformatvorlage zu einem Textverarbeitungsdokument
In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office zum programmgesteuerten Erstellen und Hinzufügen einer Absatzformatvorlage zu einem Textverarbeitungsdokument verwenden. Es enthält eine Beispielmethode CreateAndAddParagraphStyle
zur Veranschaulichung dieser Aufgabe sowie eine ergänzende Beispielmethode zum Hinzufügen des Stilteils bei Bedarf.
CreateAndAddParagraphStyle-Methode
Die CreateAndAddParagraphStyle
Beispielmethode kann verwendet werden, um einem Textverarbeitungsdokument eine Formatvorlage hinzuzufügen. Sie müssen zunächst einen Verweis auf den Teil der Formatvorlagendefinitionen in dem Dokument abrufen, dem Sie die Formatvorlage hinzufügen möchten. Weitere Informationen und ein Beispiel dafür finden Sie im Abschnitt Aufrufen der Beispielmethode .
Die -Methode akzeptiert vier Parameter, die angeben: einen Verweis auf den Stildefinitionsteil, die Formatvorlagen-ID (ein interner Bezeichner), den Namen der Formatvorlage (für die externe Verwendung in der Benutzeroberfläche) und optional alle Formataliase (alternative Namen für die Verwendung in der Benutzeroberfläche).
static void CreateAndAddParagraphStyle(StyleDefinitionsPart styleDefinitionsPart, string styleid, string stylename, string aliases = "")
Den vollständigen Codeeintrag für die Methode finden Sie im Abschnitt Beispielcode.
Informationen zu Format-IDs, Formatvorlagennamen und Aliasen
Die Formatvorlagen-ID wird vom Dokument verwendet, um auf die Formatvorlage zu verweisen, und kann als primärer Bezeichner betrachtet werden. In der Regel verwenden Sie die Formatvorlagen-ID, um eine Formatvorlage im Code zu identifizieren. Eine Formatvorlage kann auch über einen separaten Anzeigenamen in der Benutzeroberfläche verfügen. Häufig wird der Formatvorlagenname daher in richtiger Groß-/Kleinschreibung und mit Abstand (z. B. Überschrift 1) angezeigt, während die Formatvorlagen-ID prägnanter ist (z. B. überschrift1) und für die interne Verwendung vorgesehen ist. Aliase geben Alternative Formatnamen an, die von der Benutzeroberfläche einer Anwendung verwendet werden können.
Betrachten Sie beispielsweise das folgende XML-Codebeispiel aus einer Formatdefinition.
<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>
Das styleId-Attribut des Style-Elements enthält den Standard internen Bezeichner des Stils, die Formatvorlagen-ID (OverdueAmountPara). Das Aliases-Element gibt zwei alternative Formatvorlagennamen an, Late Due und Late Amount, die durch Trennzeichen getrennt sind. Jeder Name muss durch ein oder mehrere Kommas getrennt werden. Schließlich gibt das Name-Element den primären Stilnamen an, der in der Regel auf der Benutzeroberfläche einer Anwendung angezeigt wird.
Aufrufen der Beispielmethode
Verwenden Sie die CreateAndAddParagraphStyle
Beispielmethode, um mithilfe des Open XML SDK eine benannte Formatvorlage zu erstellen und einem Textverarbeitungsdokument hinzuzufügen. Das folgende Codebeispiel zeigt, wie Sie einen Verweis auf ein Textverarbeitungsdokument öffnen und abrufen, einen Verweis auf den Teil der Formatvorlagendefinitionen des Dokuments abrufen und dann die CreateAndAddParagraphStyle
-Methode aufrufen.
Um die -Methode aufzurufen, übergeben Sie einen Verweis auf den Stildefinitionsteil als ersten Parameter, die Formatvorlagen-ID der Formatvorlage als zweiten Parameter, den Namen der Formatvorlage als dritten Parameter und optional alle Formataliase als vierten Parameter. Der folgende Code erstellt z. B. die Absatzformatvorlage "Overdue Amount Para". Außerdem wird ein Textabsatz hinzugefügt und die Formatvorlage auf den Absatz angewendet.
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;
}
Formatvorlagentypen
WordprocessingML unterstützt sechs Formatvorlagentypen, von denen vier mithilfe des type-Attributs für das Style-Element angegeben werden können. In den folgenden Informationen aus Abschnitt 17.7.4.17 in der SPEZIFIKATION ISO/IEC 29500 werden Stiltypen vorgestellt.
Formatvorlagentypen bezieht sich auf die -Eigenschaft einer Formatvorlage, die den Typ der mit dieser Formatvorlagendefinition erstellten Formatvorlage definiert. WordprocessingML unterstützt sechs Typen von Formatdefinitionen anhand der Werte für das Typattribut der Formatvorlagendefinition:
Absatzformatvorlagen
Zeichenstile
Verknüpfte Formatvorlagen (Absatz + Zeichen) [Hinweis: Erfolgt über das Linkelement (§17.7.4.6). Ende des Hinweises]
Tabellenformate
Nummerierungsformate
Standardeigenschaften für Absatz und Zeichen
Beispiel: Betrachten Sie eine Formatvorlage namens Überschrift 1 in einem Dokument wie folgt:
<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>
Das Type-Attribut weist den Wert paragraph auf, der angibt, dass die folgende Formatvorlagendefinition eine Absatzformatvorlage ist.
© ISO/IEC 29500: 2016
Sie können die Typen von Absatz-, Zeichen-, Tabellen- und Nummerierungsformatvorlagen festlegen, indem Sie den entsprechenden Wert im Type-Attribut des Formatvorlagenelements angeben.
Absatzformatvorlage
Sie geben absatz als Stiltyp an, indem Sie den Wert des Type-Attributs für das Formatelement auf "paragraph" festlegen.
In den folgenden Informationen aus Abschnitt 17.7.8 der SPEZIFIKATION ISO/IEC 29500 werden Absatzstile erläutert. Beachten Sie, dass Abschnittsnummern, denen § vorangestellt ist, Abschnitte in der ISO-Spezifikation angeben.
17.7.8 Absatzarten
Absatzformatvorlagen sind Formatvorlagen, die sowohl auf den Inhalt eines gesamten Absatzes als auch auf die Absatzmarke angewendet werden. Diese Definition impliziert, dass die Formatvorlage sowohl Zeicheneigenschaften (Eigenschaften, die für Text im Dokument gelten) als auch Absatzeigenschaften (Eigenschaften, die für die Positionierung und Darstellung des Absatzes gelten) definieren kann. Auf Absatzformatvorlagen kann nicht durch Ausführungen innerhalb eines Dokuments verwiesen werden. Auf sie muss vom pStyle-Element (§17.3.1.27) innerhalb des Absatzeigenschaftenelements eines Absatzes verwiesen werden.
Eine Absatzformatvorlage weist drei formattypspezifische Merkmale auf:
Das Type-Attribut der Formatvorlage weist den Wert paragraph auf, der angibt, dass die folgende Formatvorlagendefinition eine Absatzformatvorlage ist.
Das nächste Element definiert ein Bearbeitungsverhalten, das die Absatzformatvorlage bereitstellt, die automatisch auf den nächsten Absatz angewendet wird, wenn die EINGABETASTE am Ende eines Absatzes dieser Formatvorlage gedrückt wird.
Die Formatvorlage gibt sowohl Eigenschaften auf Absatz- als auch Zeichenebene mit den pPr - bzw. rPr-Elementen an. In diesem Fall sind die Ausführungseigenschaften der Satz von Eigenschaften, die auf jede Ausführung im Absatz angewendet werden.
Die Absatzformatvorlage wird dann auf Absätze angewendet, indem auf den styleId-Attributwert für diese Formatvorlage im pStyle-Element der Absatzeigenschaften verwiesen wird.
© ISO/IEC 29500: 2016
Funktionsweise des Codes
Die CreateAndAddParagraphStyle
-Methode ruft zunächst einen Verweis auf das Styles-Element im Formatvorlagenteil ab. Das Styles-Element ist das Stammelement des Teils und enthält alle einzelnen Stilelemente. Wenn der Verweis NULL ist, wird das Styles-Element erstellt.
// Access the root element of the styles part.
Styles? styles = styleDefinitionsPart.Styles;
if (styles is null)
{
styleDefinitionsPart.Styles = new Styles();
styles = styleDefinitionsPart.Styles;
}
Erstellen des Stils
Um die Formatvorlage zu erstellen, instanziiert der Code die Style -Klasse und legt bestimmte Eigenschaften fest, z. B. die Type der Formatvorlage (Absatz), die StyleId, ob die Formatvorlage ein CustomStyleist und ob die Formatvorlage die Default Formatvorlage für ihren Typ ist.
// 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
};
Der Code ergibt den folgenden XML-Code.
<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>
Der Code erstellt als Nächstes die untergeordneten Elemente des Stils, die die Eigenschaften der Formatvorlage definieren. Um ein Element zu erstellen, instanziieren Sie die entsprechende Klasse, und rufen Sie dann die Append -Methode auf, um das untergeordnete Element zum Stil hinzuzufügen. Weitere Informationen zu diesen Eigenschaften finden Sie in Abschnitt 17.7 der ISO/IEC 29500-Spezifikation .
// 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);
Als Nächstes instanziiert der Code ein StyleRunProperties -Objekt, um ein rPr
(Run Properties)-Element zu erstellen. In diesem Element geben Sie die Zeicheneigenschaften an, die für die Formatvorlage gelten, z. B. Schriftart und Farbe. Die Eigenschaften werden dann als untergeordnete Elemente des rPr
-Elements angefügt.
Wenn die Ausführungseigenschaften erstellt werden, fügt der Code das rPr
Element an die Formatvorlage und das style-Element an das Stammelement styles im Formatvorlagenteil an.
// 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);
Anwenden der Absatzformatvorlage
Wenn Sie die Formatvorlage erstellt haben, können Sie sie auf einen Absatz anwenden, indem Sie auf den styleId-Attributwert für diese Formatvorlage im pStyle-Element der Absatzeigenschaften verweisen. Das folgende Codebeispiel zeigt, wie Sie eine Formatvorlage auf einen Absatz anwenden, auf den die Variable p verweist. Die Formatvorlagen-ID der anzuwendenden Formatvorlage wird in der Parastyleid-Variable gespeichert, und die ParagraphStyleId-Eigenschaft stellt das Element der Absatzeigenschaften pStyle
dar.
// 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;
Beispielcode
Im Folgenden finden Sie das vollständige CreateAndAddParagraphStyle
Codebeispiel in C# und 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;
}