Cómo trabajar con tablas en Python

Cómo trabajar con tablas en Python

Aspose.Slides FOSS for Python supports creating tables on slides with configurable column widths and row heights. This guide shows how to add a table, populate it with data, and apply basic text formatting to cells.

Guía paso a paso

Paso 1: Instalar el paquete

pip install aspose-slides-foss

Paso 2: Crear o abrir una presentación

import aspose.slides_foss as slides
from aspose.slides_foss.export import SaveFormat

with slides.Presentation() as prs:
    slide = prs.slides[0]
    # ... add table ...
    prs.save("table.pptx", SaveFormat.PPTX)

Paso 3: Definir anchos de columna y alturas de fila

Las tablas requieren anchos de columna y alturas de fila explícitos en puntos (1 punto = 1/72 de pulgada). Una diapositiva estándar tiene 720 puntos de ancho y 540 puntos de alto.

col_widths = [200.0, 150.0, 150.0]   # 3 columns: 200pt + 150pt + 150pt
row_heights = [45.0, 40.0, 40.0]     # 3 rows: 45pt header + 40pt data rows

Paso 4: Añadir la tabla

slide.shapes.add_table(x, y, col_widths, row_heights) crea la tabla en la posición (x, y):

import aspose.slides_foss as slides
from aspose.slides_foss.export import SaveFormat

with slides.Presentation() as prs:
    slide = prs.slides[0]

    col_widths = [200.0, 150.0, 150.0]
    row_heights = [45.0, 40.0, 40.0]
    table = slide.shapes.add_table(50, 100, col_widths, row_heights)

    prs.save("table.pptx", SaveFormat.PPTX)

Paso 5: Establecer el texto de la celda

Accede a las celdas mediante table.rows[row_index][col_index] y asigna texto a través de .text_frame.text:

import aspose.slides_foss as slides
from aspose.slides_foss.export import SaveFormat

with slides.Presentation() as prs:
    slide = prs.slides[0]

    col_widths = [200.0, 150.0, 150.0]
    row_heights = [45.0, 40.0, 40.0]
    table = slide.shapes.add_table(50, 100, col_widths, row_heights)

    # Header row (row 0)
    headers = ["Product", "Units Sold", "Revenue"]
    for col, header in enumerate(headers):
        table.rows[0][col].text_frame.text = header

    # Data rows
    data = [
        ["Widget A", "1,200", "$24,000"],
        ["Widget B", "850", "$17,000"],
    ]
    for row_idx, row_data in enumerate(data):
        for col, cell_text in enumerate(row_data):
            table.rows[row_idx + 1][col].text_frame.text = cell_text

    prs.save("sales-table.pptx", SaveFormat.PPTX)

Paso 6: Formatear el texto de la celda de encabezado

Aplica formato en negrita a las celdas de encabezado usando PortionFormat:

from aspose.slides_foss import NullableBool, FillType
from aspose.slides_foss.drawing import Color

for col in range(len(headers)):
    cell = table.rows[0][col]
    portions = cell.text_frame.paragraphs[0].portions
    if portions:
        fmt = portions[0].portion_format
        fmt.font_bold = NullableBool.TRUE
        fmt.fill_format.fill_type = FillType.SOLID
        fmt.fill_format.solid_fill_color.color = Color.from_argb(255, 255, 255, 255)

Ejemplo completo y funcional

import aspose.slides_foss as slides
from aspose.slides_foss import NullableBool, FillType
from aspose.slides_foss.drawing import Color
from aspose.slides_foss.export import SaveFormat

data_rows = [
    ["North", "$1.2M", "+8%"],
    ["South", "$0.9M", "+4%"],
    ["East",  "$1.5M", "+12%"],
    ["West",  "$0.7M", "+2%"],
]
headers = ["Region", "Revenue", "Growth"]

with slides.Presentation() as prs:
    slide = prs.slides[0]

    col_widths = [180.0, 140.0, 120.0]
    row_heights = [45.0] + [38.0] * len(data_rows)

    table = slide.shapes.add_table(60, 80, col_widths, row_heights)

    # Header row
    for col, text in enumerate(headers):
        cell = table.rows[0][col]
        cell.text_frame.text = text
        if cell.text_frame.paragraphs and cell.text_frame.paragraphs[0].portions:
            fmt = cell.text_frame.paragraphs[0].portions[0].portion_format
            fmt.font_bold = NullableBool.TRUE

    # Data rows
    for row_idx, row_data in enumerate(data_rows):
        for col, text in enumerate(row_data):
            table.rows[row_idx + 1][col].text_frame.text = text

    prs.save("regional-revenue.pptx", SaveFormat.PPTX)

print("Saved regional-revenue.pptx")

Problemas comunes y soluciones

IndexError al acceder table.rows[row][col]

Los índices de filas y columnas comienzan en cero. Si definiste row_heights con 3 elementos, los índices de fila válidos son 0, 1, 2.

El texto de la celda no aparece en el archivo guardado

Siempre asigna a través de .text_frame.text, no a través de .text directamente en el objeto celda:

# Correct
table.rows[0][0].text_frame.text = "Header"

# Wrong: AttributeError or silent failure
table.rows[0][0].text = "Header"

La posición de la tabla está fuera de la diapositiva

Verifica que x + sum(col_widths) <= 720 y y + sum(row_heights) <= 540 para una diapositiva estándar.


Preguntas frecuentes

¿Puedo fusionar celdas de la tabla?

La fusión de celdas no está soportada en esta edición.

¿Puedo aplicar un color de fondo a toda la tabla?

Aplique formato de relleno a cada celda individual:

for row_idx in range(len(table.rows)):
    for col_idx in range(len(table.rows[row_idx])):
        cell = table.rows[row_idx][col_idx]
        cell.fill_format.fill_type = FillType.SOLID
        cell.fill_format.solid_fill_color.color = Color.from_argb(255, 240, 248, 255)

¿Puedo establecer estilos de borde de celda?

Las propiedades del borde de la celda son accesibles a través de table.rows[row][col].border_* propiedades. Consulte la referencia de la API para obtener la lista completa de atributos de formato de borde.


Ver también

 Español