Praca z tekstem
Praca z tekstem
Tekst w dokumencie Word jest organizowany w węzły Run (sąsiadujące znaki współdzielące to samo formatowanie czcionki) zgrupowane wewnątrz węzłów Paragraph. Aspose.Words FOSS dla .NET udostępnia oba typy bezpośrednio, a także Font do formatowania znaków, ParagraphFormat do formatowania akapitu oraz Range do odczytywania lub zamieniania tekstu w dowolnej części drzewa. Ten przewodnik omawia runy i czcionki, formatowanie akapitu, odczytywanie i zamienianie tekstu, komentarze oraz formatowanie list w akapicie.
Runy i formatowanie znaków
Run reprezentuje fragment tekstu, który posiada jednolity zestaw formatowania; jego właściwość Text zawiera treść w postaci czystego tekstu, a właściwość Font (obiekt Font) przechowuje formatowanie znaków — Name, Size, Bold, Italic, Underline, Color, HighlightColor, Subscript/Superscript, StrikeThrough oraz wiele innych. Font.ClearFormatting() przywraca czcionkę runu do ustawień domyślnych. Runy w akapicie są dostępne poprzez jego właściwość Runs, będącą RunCollection.
Akapity i formatowanie akapitu
Paragraph jest węzłem złożonym zawierającym runy (oraz inne elementy inline) jednego akapitu; akapity dokumentu lub ciała są udostępniane jako ParagraphCollection (Body.Paragraphs). Paragraph.ParagraphFormat (obiekt ParagraphFormat) steruje układem dotyczącym akapitu — Alignment, wcięciami (LeftIndent, RightIndent, FirstLineIndent), odstępami (SpaceBefore, SpaceAfter, LineSpacing, LineSpacingRule) oraz zachowaniem podziału stron (KeepTogether, KeepWithNext, PageBreakBefore, WidowControl). ParagraphFormat.ClearFormatting() przywraca te ustawienia do wartości domyślnych, a Paragraph.JoinRunsWithSameFormatting() scala sąsiadujące runy o identycznym formatowaniu.
Odczytywanie i zamienianie tekstu przy pomocy zakresu
Każdy węzeł, który zawiera treść — Document, Section, Paragraph lub Run — udostępnia Range. Range.Text zwraca czysty tekst wszystkiego w tym zakresie, a Range.Replace(pattern, replacement) wykonuje wyszukiwanie i zamianę ograniczoną do tego zakresu, dzięki czemu możesz na przykład zamienić tekst w jednym akapicie, nie modyfikując reszty dokumentu. Range.Delete() usuwa zawartość zakresu całkowicie.
Comments
Węzeł Comment przypina komentarz do określonego miejsca w tekście; utwórz go za pomocą new Comment(doc, author, initial, dateTime) i ustaw jego treść za pomocą SetText(text), a następnie wstaw go do dokumentu jak każdy inny węzeł. Comment.AddReply(author, initial, dateTime, text) dołącza odpowiedź wątkową, a RemoveReply(reply) / RemoveAllReplies() je usuwają. Komentarze dokumentu są zbierane w CommentCollection.
Formatowanie listy na poziomie akapitu
Paragraph.ListFormat (obiekt ListFormat) informuje i kontroluje, czy akapit jest częścią listy: IsListItem i ListLevelNumber podają jego bieżący stan, ApplyBulletDefault() i ApplyNumberDefault() zamieniają akapit w domyślny element listy wypunktowanej lub numerowanej, ListIndent() / ListOutdent() zmieniają poziom zagnieżdżenia listy, a RemoveNumbers() przywraca go do zwykłego akapitu.
Wskazówki i najlepsze praktyki
- Ustaw właściwości czcionki na
DocumentBuilder.Fontprzed wprowadzaniem tekstu przy użyciu buildera, zamiast najpierw pisać tekst i później przekształcać poszczególne obiektyRun. - Ogranicz
Range.Replacedo najmniejszego zakresu obejmującego to, co naprawdę chcesz zmienić — wywołaj go na zakresieParagraphlubSection, a nie na całym dokumencie, gdy zmiana nie ma obowiązywać na całym dokumencie. - Wywołaj
Paragraph.JoinRunsWithSameFormatting()po serii programowych edycji, aby uniknąć niepotrzebnie fragmentowanej struktury run. - Użyj
ListFormat.ApplyBulletDefault()/ApplyNumberDefault()do szybkiego domyślnego listowania zamiast ręcznego konstruowania definicji list, gdy wbudowane domyślne wartości są wystarczające. - Odczytuj wyniki
Comment.AddReplyjako węzłyComment— odpowiedzi są pełnymi obiektami komentarzy, a nie zwykłymi ciągami znaków.
Typowe problemy
| Problem | Przyczyna | Rozwiązanie |
|---|---|---|
Formatowanie Run’s Font nie zmienia wizualnie sąsiadującego tekstu | Sąsiadujący tekst znajduje się w innym Run z własną instancją Font | Zlokalizuj i sformatuj każdy dotknięty Run, albo ustaw formatowanie za pomocą DocumentBuilder.Font przed zapisem |
Range.Replace zmienia tekst poza zamierzonym obszarem | Replace został wywołany na Document.Range zamiast zakresu węższego węzła | Wywołaj Replace na konkretnym Paragraph, Section lub innym węźle Range |
Akapit wygląda jak element listy, ale IsListItem jest fałszywe | Punkt/kropka numerująca jest ręcznie wprowadzonym tekstem, a nie rzeczywistym formatowaniem listy | Zastosuj prawdziwe formatowanie listy przy użyciu ListFormat.ApplyBulletDefault() lub ApplyNumberDefault() zamiast wpisywanych znaków |
Dokument zawiera znacznie więcej węzłów Run niż oczekiwano | Powtarzające się drobne edycje dzielą ciągi bez ich ponownego łączenia | Wywołaj Paragraph.JoinRunsWithSameFormatting() po partiach edycji |
FAQ
Jaka jest różnica między Run a Paragraph?
„Run” to fragment tekstu współdzielący jeden zestaw formatowania znaków (Font); „Paragraph” to węzeł złożony, który zawiera jeden lub więcej runów (i inną zawartość inline) oraz formatowanie na poziomie akapitu (ParagraphFormat).
Jak odczytać cały tekst w dokumencie lub sekcji?
Odczytaj właściwość Text elementu Range — na przykład document.Range.Text lub section.Range.Text.
Jak znaleźć i zamienić tekst w jednym akapicie?
Wywołaj Replace(pattern, replacement) na Range tego Paragraph, a nie na Document.Range.
Jak dodać komentarz do dokumentu?
Utwórz go przy użyciu new Comment(doc, author, initial, dateTime), ustaw jego tekst za pomocą SetText(text) i wstaw do drzewa; odpowiedz na niego przy pomocy Comment.AddReply(author, initial, dateTime, text).
Jak przekształcić akapit w element listy wypunktowanej?
Wywołaj ApplyBulletDefault() na ListFormat tego akapitu; użyj ApplyNumberDefault() dla listy numerowanej.
API Reference Podsumowanie
| Klasa/Metoda | Opis |
|---|---|
Run | Fragment tekstu dzielący jeden zestaw formatowania znaków. |
Font | Formatowanie na poziomie znaków — nazwa, rozmiar, pogrubienie, kursywa, kolor i inne. |
Paragraph | Węzeł złożony zawierający fragmenty i formatowanie jednego akapitu. |
ParagraphFormat | Formatowanie na poziomie akapitu — wyrównanie, wcięcia, odstępy, paginacja. |
ParagraphCollection | Typowana kolekcja węzłów Paragraph, np. Body.Paragraphs. |
Range | Spójny obszar dokumentu; obsługuje Text, Replace i Delete. |
Comment | Wątkowy komentarz przypięty do konkretnego miejsca w tekście. |
CommentCollection | Zbiór komentarzy dokumentu. |
ListFormat | Kontroluje, czy i w jaki sposób akapit uczestniczy w liście. |