Správa buněk tabulky v prezentacích pomocí Pythonu

Přehled

Aspose.Slides vám umožňuje přistupovat k buňkám tabulky a upravovat je v prezentacích PowerPoint. Tento článek vysvětluje, jak identifikovat sloučené buňky tabulky, odstranit okraje buněk, pracovat s číslováním buněk po sloučení nebo rozdělení buněk, změnit barvu pozadí buňky a přidat obrázek uvnitř buňky tabulky. Příklady ukazují, jak vytvořit nebo otevřít prezentaci, získat tabulku ze snímku, aktualizovat formátování buňky pomocí vlastností buňky a uložit upravenou prezentaci jako soubor PPTX.

Aspose.Slides používá nulové indexování pro přístup k buňkám tabulky v pořadí (sloupec, řádek).

Identifikovat sloučenou buňku tabulky

Příklad otevře existující prezentaci a přistoupí k prvnímu tvaru na první snímku jako k tabulce. Předpokládá, že snímek a tvar existují a že tvar je tabulka. Pak iteruje přes všechny řádky a sloupce a používá isMergedCell k identifikaci buněk ve sloučených oblastech. Pro každou shodu vytiskne souřadnice buňky v pořadí row;column, getRowSpan, getColSpan a počáteční souřadnice oblasti, getFirstRowIndex a getFirstColumnIndex.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

presentation = Presentation("presentation_with_table.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    table = slide.getShapes().get_Item(0)

    row_count = table.getRows().size()
    for row_index in range(row_count):
        column_count = table.getColumns().size()
        for column_index in range(column_count):
            cell = table.get_Item(column_index, row_index)
            if cell.isMergedCell():
                print(f"Cell {row_index};{column_index} belongs to a merged region with RowSpan={cell.getRowSpan()} and ColSpan={cell.getColSpan()} starting at {cell.getFirstRowIndex()};{cell.getFirstColumnIndex()}.")
finally:
    presentation.dispose()

Odstranit okraje buněk tabulky

Vytvořte Presentation a přidejte tabulku na první snímek pomocí addTable. Šířky sloupců, výšky řádků a pozice tabulky jsou zadány v bodech. Příklad nastaví všechny čtyři okraje buňky na FillType.NoFill, čímž je učiní neviditelnými.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, FillType, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    column_widths = [50, 50, 50, 50]
    row_heights = [50, 30, 30, 30, 30]
    table = slide.getShapes().addTable(100, 50, column_widths, row_heights)

    for row in table.getRows():
        for cell in row:
            cell.getCellFormat().getBorderTop().getFillFormat().setFillType(FillType.NoFill)
            cell.getCellFormat().getBorderBottom().getFillFormat().setFillType(FillType.NoFill)
            cell.getCellFormat().getBorderLeft().getFillFormat().setFillType(FillType.NoFill)
            cell.getCellFormat().getBorderRight().getFillFormat().setFillType(FillType.NoFill)

    presentation.save("table.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Sloučit buňky tabulky

Použijte mergeCells ke sloučení obdélníkového rozsahu buněk tabulky do jedné buňky. Zadejte buňky v levém horním a pravém dolním rohu rozsahu. Poslední argument určuje, zda sloučení může zahrnovat buňky mimo zadaný rozsah; False udržuje sloučení v tomto rozsahu.

Příklad vytvoří tabulku 4 × 4 s 70‑bodovými sloupci a řádky, pak sloučí čtyři střední buňky od (1, 1) po (2, 2). Výsledná buňka zasahuje přes dva sloupce a dva řádky, zatímco podkladová mřížka tabulky si zachovává čtyři sloupce a čtyři řádky. Pro přístup k obsahu nebo formátování sloučené buňky použijte její levý horní pozici: table.get_Item(1, 1) v tomto příkladu. Ostatní pozice ve sloučeném rozsahu zůstávají součástí mřížky tabulky, takže indexy buněk mimo rozsah se nemění.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    column_widths = [70, 70, 70, 70]
    row_heights = [70, 70, 70, 70]
    table = slide.getShapes().addTable(100, 50, column_widths, row_heights)

    table.mergeCells(table.get_Item(1, 1), table.get_Item(2, 2), False)

    presentation.save("merged_cells.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Rozdělit buňky tabulky

Sloučení buněk v předchozím příkladu zachovává mřížku tabulky. Rozdělení buňky může zavést nový sloupec mřížky a změnit indexy sloupců buněk napravo od ní. Aspose.Slides se řídí modelem mřížky tabulky PowerPointu.

Tento příklad vytvoří tabulku 4 × 4 s 70‑bodovými sloupci a řádky a zavolá splitByWidth na buňce (1, 1). Polovina 70‑bodové šířky buňky je použita k vytvoření dvou buněk stejné šířky.

Po tomto rozdělení jsou dvě poloviny přístupné jako table.get_Item(1, 1) a table.get_Item(2, 1). Mřížka tabulky nyní má pět sloupců: buňky původně ve sloupcích 2 a 3 se přesunou do sloupců 3 a 4, respektive. Indexy řádků zůstávají beze změny. Používejte tyto aktualizované indexy sloupců při přístupu k buňkám po rozdělení.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    column_widths = [70, 70, 70, 70]
    row_heights = [70, 70, 70, 70]
    table = slide.getShapes().addTable(100, 50, column_widths, row_heights)

    table.get_Item(1, 1).splitByWidth(table.get_Item(1, 1).getWidth() / 2)

    presentation.save("split_cells.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Rozdělit sloučené buňky podle řádkového nebo sloupcového rozpětí

Pro přípravu sloučených buněk šablony k naplnění daty použijte splitByRowSpan pro rozdělení podél existující řádkové hranice nebo splitByColSpan pro rozdělení podél sloupcové hranice.

Argument index počítá řádky v horní části nebo sloupce v levé části rozdělení; je relativní k sloučenému regionu:

Příklad předpokládá, že prezentace má tabulku jako první tvar na prvním snímku, kde jsou buňky (1, 2) a (1, 3) sloučeny svisle. Začíná od dolní pozice, používá getFirstColumnIndex a getFirstRowIndex k určení počátku a kontroluje oba rozpětí. splitByRowSpan(1) pak odděluje řádky 2 a 3 pro názvy produktů. Pro vodorovné sloučení dvou sloupců použijte místo toho splitByColSpan(1).

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("table_template.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    table = slide.getShapes().get_Item(0)

    selected_cell = table.get_Item(1, 3)
    first_column_index = selected_cell.getFirstColumnIndex()
    first_row_index = selected_cell.getFirstRowIndex()
    merged_cell = table.get_Item(first_column_index, first_row_index)

    if merged_cell.isMergedCell() and merged_cell.getRowSpan() == 2 and merged_cell.getColSpan() == 1:
        merged_cell.splitByRowSpan(1)

            # Získejte výsledné buňky z tabulky po rozdělení.
            upper_cell = table.get_Item(first_column_index, first_row_index)
            lower_cell = table.get_Item(first_column_index, first_row_index + 1)
            print(f"Upper cell merged: {upper_cell.isMergedCell()}")
            print(f"Lower cell merged: {lower_cell.isMergedCell()}")

            upper_cell.getTextFrame().setText("Product A")
            lower_cell.getTextFrame().setText("Product B")

            presentation.save("split_template.pptx", SaveFormat.Pptx)
    else:
        print("Select a merged region spanning exactly two rows and one column.")
finally:
    presentation.dispose()

Mřížka tabulky a okolní indexy buněk zůstávají nezměněny. Získejte výsledné buňky podle jejich souřadnic; zde obě mají rozsah 1 a isMergedCell vypíše False. Větší oblasti mohou po jednom rozdělení zůstávat částečně sloučené.

Původní text a jeho formátování zůstávají v horní (nebo levé) buňce; nová buňka je prázdná, ale dědí formátování buňky, jako je výplň, okraje a okraje. Naplňte buňky po rozdělení a nastavte případné požadované formátování textu explicitně.

Uložená prezentace obsahuje samostatné buňky “Product A” a “Product B” s ponechaným formátováním buněk šablony. Viz Cell API Reference pro podrobnosti.

Změnit barvu pozadí buňky tabulky

Tento příklad vytvoří tabulku se 150‑bodovými sloupci a 50‑bodovými řádky. Používá setFillType k výběru plné výplně a nastavuje barvu vrácenou metodou getSolidFillColor na červenou pro buňku (2, 3), ve třetím sloupci a čtvrtém řádku.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, FillType, SaveFormat
from java.awt import Color

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    column_widths = [150, 150, 150, 150]
    row_heights = [50, 50, 50, 50, 50]
    table = slide.getShapes().addTable(50, 50, column_widths, row_heights)

    cell = table.get_Item(2, 3)
    cell.getCellFormat().getFillFormat().setFillType(FillType.Solid)
    cell.getCellFormat().getFillFormat().getSolidFillColor().setColor(Color.RED)

    presentation.save("cell_background_color.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Přidat obrázek do buňky tabulky

Umístěte vstupní obrázek do pracovního adresáře před spuštěním tohoto příkladu. Načte obrázek pomocí Images.fromFile a přidá jej do kolekce obrázků prezentace pomocí addImage. Poté přiřadí obrázek k výplni obrázku buňky (0, 0), první buňky v tabulce.

PictureFillMode.Stretch roztáhne obrázek tak, aby vyplnil buňku, což může změnit její poměr stran. Šířky sloupců a výšky řádků jsou v bodech. Načtený obrázek je uvolněn v bloku finally po jeho přidání do prezentace.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, Images, FillType, PictureFillMode, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    column_widths = [150, 150, 150, 150]
    row_heights = [100, 100, 100, 100, 90]
    table = slide.getShapes().addTable(50, 50, column_widths, row_heights)

    image = Images.fromFile("aspose_logo.jpg")
    try:
        presentation_image = presentation.getImages().addImage(image)
    finally:
        image.dispose()

    table.get_Item(0, 0).getCellFormat().getFillFormat().setFillType(FillType.Picture)
    table.get_Item(0, 0).getCellFormat().getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch)
    table.get_Item(0, 0).getCellFormat().getFillFormat().getPictureFillFormat().getPicture().setImage(presentation_image)

    presentation.save("table_cell_with_image.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Často kladené otázky

Mohu nastavit různé tloušťky čar a styly pro různé strany jedné buňky?

Ano. Okraje horní/spodní/levý/pravý mají samostatné vlastnosti, takže tloušťka a styl každé strany se mohou lišit.

Co se stane s obrázkem, pokud po nastavení obrázku jako pozadí buňky změním velikost sloupce/řádku?

Chování závisí na režim výplně. Při roztahování se obrázek přizpůsobí nové buňce; při dlaždicování se dlaždice přepočítají.

Mohu přiřadit hypertextový odkaz k veškerému obsahu buňky?

Hyperlinky jsou nastavovány na úrovni textu (části) uvnitř textového rámce buňky nebo na úrovni celé tabulky/tvaru. V praxi přiřadíte odkaz k části nebo k celému textu v buňce.

Mohu nastavit různé písma v jedné buňce?

Ano. Textový rámec buňky podporuje části (běhy) s nezávislým formátováním – rodinu písma, styl, velikost a barvu.