Trabajando con Texto
Trabajando con Texto
El texto en un documento de Word está organizado en nodos Run (caracteres contiguos que comparten el mismo formato de fuente) agrupados dentro de nodos Paragraph. Aspose.Words FOSS para .NET expone ambos directamente, junto con Font para el formato de caracteres, ParagraphFormat para el formato a nivel de párrafo, y Range para leer o reemplazar texto en cualquier parte del árbol. Esta guía cubre runs y fuentes, formato de párrafo, lectura y reemplazo de texto, comentarios y formato de listas a nivel de párrafo.
Runs y Formato de Caracteres
Un Run representa un tramo de texto que comparte un conjunto de formato; su propiedad Text contiene el contenido de texto plano y su propiedad Font (un objeto Font) contiene el formato a nivel de carácter — Name, Size, Bold, Italic, Underline, Color, HighlightColor, Subscript/Superscript, StrikeThrough, y muchos más. Font.ClearFormatting() restablece la fuente de un run a los valores predeterminados. Los runs de un párrafo están disponibles a través de su propiedad Runs, un RunCollection.
Párrafos y Formato de Párrafo
Paragraph es un nodo compuesto que contiene los runs (y otro contenido en línea) de un párrafo; los párrafos de un documento o cuerpo se exponen como un ParagraphCollection (Body.Paragraphs). Paragraph.ParagraphFormat (un objeto ParagraphFormat) controla el diseño a nivel de párrafo — Alignment, sangrías (LeftIndent, RightIndent, FirstLineIndent), espaciado (SpaceBefore, SpaceAfter, LineSpacing, LineSpacingRule), y el comportamiento de paginación (KeepTogether, KeepWithNext, PageBreakBefore, WidowControl). ParagraphFormat.ClearFormatting() restablece estos a los valores predeterminados, y Paragraph.JoinRunsWithSameFormatting() fusiona runs adyacentes que poseen el mismo formato.
Lectura y Reemplazo de Texto con Range
Cada nodo que contiene contenido — un Document, Section, Paragraph o Run — expone un Range. Range.Text devuelve el texto plano de todo lo que está dentro de ese rango, y Range.Replace(pattern, replacement) realiza una búsqueda y reemplazo limitado a ese rango, de modo que, por ejemplo, puedes reemplazar texto dentro de un párrafo sin tocar el resto del documento. Range.Delete() elimina el contenido del rango por completo.
Comments
Un nodo Comment ancla un comentario a una ubicación en el texto; crea uno con new Comment(doc, author, initial, dateTime) y establece su texto principal con SetText(text), luego insértalo en el documento como cualquier otro nodo. Comment.AddReply(author, initial, dateTime, text) adjunta una respuesta en hilo, y RemoveReply(reply) / RemoveAllReplies() los eliminan. Los comentarios de un documento se recopilan en un CommentCollection.
Formato de lista a nivel de párrafo
Paragraph.ListFormat (un objeto ListFormat) informa y controla si un párrafo forma parte de una lista: IsListItem y ListLevelNumber informan su estado actual, ApplyBulletDefault() y ApplyNumberDefault() convierten un párrafo en un elemento de lista con viñetas o numerado por defecto, ListIndent() / ListOutdent() cambian su nivel de anidamiento en la lista, y RemoveNumbers() lo devuelve a un párrafo normal.
Consejos y buenas prácticas
- Establece las propiedades de fuente en
DocumentBuilder.Fontantes de escribir texto con el generador, en lugar de escribir el texto primero y volver a formatear individualmente los objetosRundespués. - Limita el alcance de
Range.Replaceal rango más pequeño que cubra lo que realmente deseas cambiar — llámalo en el rango de unParagraphoSectionen lugar de todo el documento cuando el cambio no debe aplicarse a nivel de documento. - Llame a
Paragraph.JoinRunsWithSameFormatting()después de una serie de ediciones programáticas para evitar una estructura de ejecuciones innecesariamente fragmentada. - Utilice
ListFormat.ApplyBulletDefault()/ApplyNumberDefault()para obtener una lista predeterminada rápida en lugar de construir definiciones de lista manualmente cuando los valores predeterminados incorporados son suficientes. - Lea los resultados de
Comment.AddReplycomo nodosComment— las respuestas son objetos de comentario completos, no cadenas simples.
Problemas comunes
| Problema | Causa | Solución |
|---|---|---|
Dar formato al Run’s Font no cambia visualmente el texto adyacente | El texto adyacente está en un Run diferente con su propia instancia de Font | Ubique y formatee cada Run afectado, o establezca el formato mediante DocumentBuilder.Font antes de escribir |
Range.Replace cambia el texto fuera del área prevista | Replace se llamó sobre Document.Range en lugar del rango de un nodo más estrecho | Llame a Replace en el Paragraph específico, Section, o el Range de otro nodo |
Un párrafo parece un elemento de lista pero IsListItem es falso | La viñeta/número es texto manual, no un formato de lista real | Aplique formato de lista real con ListFormat.ApplyBulletDefault() o ApplyNumberDefault() en lugar de caracteres escritos |
El documento tiene muchos más nodos Run de lo esperado | Ediciones pequeñas repetidas dividen corridas sin volver a unirlas | Llame a Paragraph.JoinRunsWithSameFormatting() después de lotes de ediciones |
FAQ
¿Cuál es la diferencia entre Run y Paragraph?
Un Run es un tramo de texto que comparte un conjunto de formato de caracteres (Font); un Paragraph es el nodo compuesto que contiene una o más ejecuciones (y otro contenido en línea) además del formato a nivel de párrafo (ParagraphFormat).
¿Cómo leo todo el texto en un documento o sección?
Lea la propiedad Text del Range de ese nodo — por ejemplo, document.Range.Text o section.Range.Text.
¿Cómo encuentro y reemplazo texto en un solo párrafo?
Llame a Replace(pattern, replacement) sobre el Range de ese Paragraph en lugar de sobre Document.Range.
¿Cómo añado un comentario a un documento?
Créelo con new Comment(doc, author, initial, dateTime), establezca su texto con SetText(text) e insértelo en el árbol; responda a él con Comment.AddReply(author, initial, dateTime, text).
¿Cómo convierto un párrafo en un elemento de lista con viñetas?
Llame a ApplyBulletDefault() sobre el ListFormat de ese párrafo; use ApplyNumberDefault() para una lista numerada en su lugar.
API Reference Resumen
| Clase/Método | Descripción |
|---|---|
Run | Un fragmento de texto que comparte un conjunto de formato de caracteres. |
Font | Formato a nivel de carácter — nombre, tamaño, negrita, cursiva, color y más. |
Paragraph | Nodo compuesto que contiene los fragmentos y el formato de un párrafo. |
ParagraphFormat | Formato a nivel de párrafo — alineación, sangrías, espaciado, paginación. |
ParagraphCollection | Colección tipada de nodos Paragraph, p. ej. Body.Paragraphs. |
Range | Una zona contigua del documento; admite Text, Replace y Delete. |
Comment | Un comentario en hilo anclado a una ubicación en el texto. |
CommentCollection | La colección de comentarios del documento. |
ListFormat | Controla si y cómo un párrafo participa en una lista. |