Arbeiten mit Text
Arbeiten mit Text
Text in einem Word-Dokument ist in Run-Knoten (zusammenhängende Zeichen, die dieselbe Schriftformatierung teilen) gruppiert, die in Paragraph-Knoten enthalten sind. Aspose.Words FOSS für .NET stellt beide direkt bereit, zusammen mit Font für Zeichenformatierung, ParagraphFormat für Absatzformatierung und Range zum Lesen oder Ersetzen von Text in beliebigem Teil des Baums. Dieser Leitfaden behandelt Runs und Schriftarten, Absatzformatierung, das Lesen und Ersetzen von Text, Kommentare und Listenformatierung auf Absatzebene.
Runs und Zeichenformatierung
Ein Run stellt einen Textabschnitt dar, der eine einheitliche Formatierung aufweist; seine Text-Eigenschaft enthält den Klartextinhalt und seine Font-Eigenschaft (ein Font-Objekt) enthält die Zeichenformatierung — Name, Size, Bold, Italic, Underline, Color, HighlightColor, Subscript/Superscript, StrikeThrough und viele weitere. Font.ClearFormatting() setzt die Schrift eines Runs auf die Vorgaben zurück. Die Runs eines Absatzes sind über seine Runs-Eigenschaft verfügbar, ein RunCollection.
Absätze und Absatzformatierung
Paragraph ist ein zusammengesetzter Knoten, der die Runs (und anderen Inline-Inhalt) eines Absatzes enthält; die Absätze eines Dokuments oder Körpers werden als ParagraphCollection (Body.Paragraphs) bereitgestellt. Paragraph.ParagraphFormat (ein ParagraphFormat-Objekt) steuert das Layout auf Absatzebene — Alignment, Einzüge (LeftIndent, RightIndent, FirstLineIndent), Abstände (SpaceBefore, SpaceAfter, LineSpacing, LineSpacingRule) und das Seitenumbruchverhalten (KeepTogether, KeepWithNext, PageBreakBefore, WidowControl). ParagraphFormat.ClearFormatting() setzt diese auf die Vorgaben zurück, und Paragraph.JoinRunsWithSameFormatting() führt benachbarte Runs zusammen, die identische Formatierung aufweisen.
Lesen und Ersetzen von Text mit Range
Jeder Knoten, der Inhalt enthält — ein Document, Section, Paragraph oder Run — stellt ein Range bereit. Range.Text gibt den Nur-Text von allem innerhalb dieses Bereichs zurück, und Range.Replace(pattern, replacement) führt ein Suchen-Und-Ersetzen nur in diesem Bereich durch, sodass Sie zum Beispiel Text in einem Absatz ersetzen können, ohne den Rest des Dokuments zu verändern. Range.Delete() entfernt den Inhalt des Bereichs vollständig.
Comments
Ein Comment-Knoten verankert einen Kommentar an einer Stelle im Text; erstellen Sie einen mit new Comment(doc, author, initial, dateTime) und setzen Sie dessen Haupttext mit SetText(text), dann fügen Sie ihn wie jeden anderen Knoten in das Dokument ein. Comment.AddReply(author, initial, dateTime, text) fügt eine Thread-Antwort hinzu, und RemoveReply(reply) / RemoveAllReplies() entfernen sie. Die Kommentare eines Dokuments werden in einem CommentCollection gesammelt.
Listformatierung auf Absatzebene
Paragraph.ListFormat (ein ListFormat-Objekt) gibt Auskunft und steuert, ob ein Absatz Teil einer Liste ist: IsListItem und ListLevelNumber melden den aktuellen Zustand, ApplyBulletDefault() und ApplyNumberDefault() verwandeln einen Absatz in ein Standard-Aufzählungs- bzw. Nummerierungslisten-Element, ListIndent() / ListOutdent() ändern dessen Listeneinrückungsstufe, und RemoveNumbers() macht ihn wieder zu einem regulären Absatz.
Tipps und bewährte Vorgehensweisen
- Legen Sie die Schriftarteigenschaften für
DocumentBuilder.Fontfest, bevor Sie Text mit dem Builder schreiben, anstatt zuerst Text zu schreiben und anschließend einzelneRun-Objekte neu zu formatieren. - Begrenzen Sie
Range.Replaceauf den kleinsten Bereich, der das tatsächlich zu ändernde Element abdeckt — rufen Sie es für den Bereich einesParagraphoderSectionauf, anstatt das gesamte Dokument zu verwenden, wenn die Änderung nicht dokumentweit gelten soll. - Rufen Sie
Paragraph.JoinRunsWithSameFormatting()nach einer Reihe programmgesteuerter Änderungen auf, um eine unnötig fragmentierte Laufstruktur zu vermeiden. - Verwenden Sie
ListFormat.ApplyBulletDefault()/ApplyNumberDefault()für eine schnelle Standardliste, anstatt Listendefinitionen manuell zu erstellen, wenn die integrierten Vorgaben ausreichen. - Lesen Sie die
Comment.AddReply-Ergebnisse alsComment-Knoten — Antworten sind vollständige Kommentarobjekte, keine einfachen Zeichenketten.
Häufige Probleme
| Problem | Ursache | Lösung |
|---|---|---|
Das Formatieren eines Runs Font ändert den angrenzenden Text nicht visuell | Der angrenzende Text befindet sich in einem anderen Run mit einer eigenen Font-Instanz | Suchen und formatieren Sie jedes betroffene Run, oder setzen Sie die Formatierung über DocumentBuilder.Font vor dem Schreiben |
Range.Replace ändert Text außerhalb des beabsichtigten Bereichs | Replace wurde auf Document.Range aufgerufen, anstatt auf den Bereich eines kleineren Knotens | Rufen Sie Replace für das spezifische Paragraph, Section oder das Range eines anderen Knotens auf |
Ein Absatz sieht aus wie ein Listeneintrag, aber IsListItem ist falsch | Der Aufzählungszeichen/Nummer ist manueller Text, nicht echte Listformatierung | Wenden Sie echte Listformatierung mit ListFormat.ApplyBulletDefault() oder ApplyNumberDefault() anstelle von getippten Zeichen an |
Das Dokument enthält deutlich mehr Run-Knoten als erwartet | Wiederholte kleine Änderungen teilen Läufe, ohne sie wieder zusammenzufügen | Rufen Sie Paragraph.JoinRunsWithSameFormatting() nach Bearbeitungspaketen auf |
FAQ
Was ist der Unterschied zwischen Run und Paragraph?
Ein Run ist ein Textabschnitt, der ein Satz von Zeichenformatierungen (Font) gemeinsam nutzt; ein Paragraph ist der zusammengesetzte Knoten, der einen oder mehrere Runs (und andere Inline-Inhalte) sowie Absatzformatierungen (ParagraphFormat) enthält.
Wie lese ich den gesamten Text in einem Dokument oder Abschnitt?
Lese die Text-Eigenschaft des Range dieses Knotens — zum Beispiel document.Range.Text oder section.Range.Text.
Wie finde und ersetze ich Text in nur einem Absatz?
Rufe Replace(pattern, replacement) auf dem Range dieses Paragraph auf, anstatt auf Document.Range.
Wie füge ich einem Dokument einen Kommentar hinzu?
Erstelle es mit new Comment(doc, author, initial, dateTime), setze seinen Text mit SetText(text) und füge es in den Baum ein; antworte darauf mit Comment.AddReply(author, initial, dateTime, text).
Wie verwandle ich einen Absatz in ein Aufzählungslisten-Element?
Rufe ApplyBulletDefault() auf dem ListFormat dieses Absatzes auf; verwende stattdessen ApplyNumberDefault() für eine nummerierte Liste.
API Reference Zusammenfassung
| Klasse/Methode | Beschreibung |
|---|---|
Run | Ein Textabschnitt, der ein Satz von Zeichenformatierungen gemeinsam nutzt. |
Font | Zeichenbezogene Formatierung — Name, Größe, Fett, Kursiv, Farbe und mehr. |
Paragraph | Zusammengesetzter Knoten, der die Runs und Formatierungen eines Absatzes enthält. |
ParagraphFormat | Absatzbezogene Formatierung — Ausrichtung, Einzüge, Abstand, Seitennummerierung. |
ParagraphCollection | Typisierte Sammlung von Paragraph-Knoten, z.B. Body.Paragraphs. |
Range | Ein zusammenhängender Bereich des Dokuments; unterstützt Text, Replace und Delete. |
Comment | Ein Threaded-Kommentar, der an einer Stelle im Text verankert ist. |
CommentCollection | Die Sammlung von Kommentaren des Dokuments. |
ListFormat | Steuert, ob und wie ein Absatz an einer Liste teilnimmt. |