Zarządzanie tabelami prezentacji w Pythonie

Wprowadzenie

Tabela w programie PowerPoint jest efektywnym sposobem prezentacji informacji. Informacje w siatce komórek (układanych w wiersze i kolumny) są proste i łatwe do zrozumienia.

Aspose.Slides udostępnia klasę Table klasę Cell oraz inne typy, które pozwalają tworzyć, aktualizować i zarządzać tabelami w różnego rodzaju prezentacjach.

Utworzenie tabeli od podstaw

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu po jego indeksie.
  3. Zdefiniuj listę szerokości kolumn.
  4. Zdefiniuj listę wysokości wierszy.
  5. Dodaj obiekt Table do slajdu za pomocą metody addTable.
  6. Iteruj przez każde Cell, aby zastosować formatowanie do górnych, dolnych, prawych i lewych krawędzi.
  7. Scal pierwsze dwie komórki pierwszego wiersza tabeli.
  8. Uzyskaj dostęp do TextFrame komórki Cell.
  9. Dodaj trochę tekstu do TextFrame.
  10. Zapisz zmodyfikowaną prezentację.

Ten kod w Pythonie pokazuje, jak utworzyć tabelę w prezentacji:

import jpype
import asposeslides

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

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

# Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
presentation = Presentation()
try:

    # Uzyskuje dostęp do pierwszego slajdu
    slide = presentation.getSlides().get_Item(0)

    # Definiuje kolumny o określonych szerokościach i wiersze o określonych wysokościach
    column_widths = [50, 50, 50]
    row_heights = [50, 30, 30, 30, 30]

    # Dodaje kształt tabeli do slajdu
    table = slide.getShapes().addTable(100, 50, column_widths, row_heights)

    # Ustawia format krawędzi dla każdej komórki
    for row in table.getRows():
        for cell in row:
            cell_format = cell.getCellFormat()
            cell_format.getBorderTop().getFillFormat().setFillType(FillType.Solid)
            cell_format.getBorderTop().getFillFormat().getSolidFillColor().setColor(Color.RED)
            cell_format.getBorderTop().setWidth(5)
            cell_format.getBorderBottom().getFillFormat().setFillType(FillType.Solid)
            cell_format.getBorderBottom().getFillFormat().getSolidFillColor().setColor(Color.RED)
            cell_format.getBorderBottom().setWidth(5)
            cell_format.getBorderLeft().getFillFormat().setFillType(FillType.Solid)
            cell_format.getBorderLeft().getFillFormat().getSolidFillColor().setColor(Color.RED)
            cell_format.getBorderLeft().setWidth(5)
            cell_format.getBorderRight().getFillFormat().setFillType(FillType.Solid)
            cell_format.getBorderRight().getFillFormat().getSolidFillColor().setColor(Color.RED)
            cell_format.getBorderRight().setWidth(5)

    # Łączy komórki 1 i 2 wiersza 1
    table.mergeCells(table.getRows().get_Item(0).get_Item(0), table.getRows().get_Item(0).get_Item(1), False)

    # Dodaje tekst do scalonej komórki
    table.getRows().get_Item(0).get_Item(0).getTextFrame().setText("Merged Cells")

    # Zapisuje prezentację na dysku
    presentation.save("table.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Numeracja w standardowej tabeli

W standardowej tabeli numeracja komórek jest prosta i zaczyna się od zera. Pierwsza komórka w tabeli ma indeks 0,0 (kolumna 0, wiersz 0).

Na przykład, komórki w tabeli z 4 kolumnami i 4 wierszami są numerowane w następujący sposób:

(0, 0) (1, 0) (2, 0) (3, 0)
(0, 1) (1, 1) (2, 1) (3, 1)
(0, 2) (1, 2) (2, 2) (3, 2)
(0, 3) (1, 3) (2, 3) (3, 3)

Ten kod w Pythonie pokazuje, jak utworzyć tabelę ze standardową numeracją komórek:

import jpype
import asposeslides

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

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

# Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
presentation = Presentation()
try:

    # Uzyskuje dostęp do pierwszego slajdu
    slide = presentation.getSlides().get_Item(0)

    # Definiuje kolumny o określonych szerokościach i wiersze o określonych wysokościach
    column_widths = [70, 70, 70, 70]
    row_heights = [70, 70, 70, 70]

    # Dodaje kształt tabeli do slajdu
    table = slide.getShapes().addTable(100, 50, column_widths, row_heights)

    # Ustawia format krawędzi dla każdej komórki
    for row in table.getRows():
        for cell in row:
            cell.getCellFormat().getBorderTop().getFillFormat().setFillType(FillType.Solid)
            cell.getCellFormat().getBorderTop().getFillFormat().getSolidFillColor().setColor(Color.RED)
            cell.getCellFormat().getBorderTop().setWidth(5)
            cell.getCellFormat().getBorderBottom().getFillFormat().setFillType(FillType.Solid)
            cell.getCellFormat().getBorderBottom().getFillFormat().getSolidFillColor().setColor(Color.RED)
            cell.getCellFormat().getBorderBottom().setWidth(5)
            cell.getCellFormat().getBorderLeft().getFillFormat().setFillType(FillType.Solid)
            cell.getCellFormat().getBorderLeft().getFillFormat().getSolidFillColor().setColor(Color.RED)
            cell.getCellFormat().getBorderLeft().setWidth(5)
            cell.getCellFormat().getBorderRight().getFillFormat().setFillType(FillType.Solid)
            cell.getCellFormat().getBorderRight().getFillFormat().getSolidFillColor().setColor(Color.RED)
            cell.getCellFormat().getBorderRight().setWidth(5)

    # Zapisuje prezentację na dysku
    presentation.save("StandardTables_out.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Dostęp do istniejącej tabeli

  1. Utwórz instancję klasy Presentation.

  2. Uzyskaj odniesienie do slajdu zawierającego tabelę po jego indeksie.

  3. Zainicjalizuj zmienną dla obiektu Table, ustawiając ją na None.

  4. Iteruj przez wszystkie obiekty Shape aż znajdziesz tabelę.

    Jeśli podejrzewasz, że slajd, z którym pracujesz, zawiera jedną tabelę, możesz po prostu sprawdzić wszystkie jego kształty. Gdy kształt zostanie zidentyfikowany jako tabela, możesz użyć go jako obiektu Table. Jeśli jednak slajd zawiera kilka tabel, lepiej wyszukać potrzebną tabelę przy użyciu jej getAlternativeText.

  5. Użyj obiektu Table, aby pracować z tabelą. W poniższym przykładzie aktualizujemy tekst w pierwszej kolumnie drugiego wiersza.

  6. Zapisz zmodyfikowaną prezentację.

Ten kod w Pythonie pokazuje, jak uzyskać dostęp i pracować z istniejącą tabelą:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, Table

# Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
presentation = Presentation("UpdateExistingTable.pptx")
try:

    # Uzyskuje dostęp do pierwszego slajdu
    slide = presentation.getSlides().get_Item(0)

    # Inicjalizuje referencję do tabeli.
    table = None

    # Iteruje przez kształty i ustawia referencję do znalezionej tabeli
    for shape in slide.getShapes():
        if isinstance(shape, Table):
            table = shape

            # Ustawia tekst dla pierwszej kolumny drugiego wiersza
            table.get_Item(0, 1).getTextFrame().setText("New")

    # Zapisuje zmodyfikowaną prezentację na dysku
    presentation.save("table1_out.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Znajdowanie komórki, która posiada ramkę tekstową

Gdy ogólny kod przetwarzający tekst otrzymuje TextFrame z tabeli, użyj metody TextFrame.getParentCell, aby pobrać właściciela – Cell. Dla ramki tekstowej w komórce tabeli, TextFrame.getParentCell zwraca właściciela, a TextFrame.getParentShape zwraca None, mimo że sama tabela jest kształtem.

Współrzędne komórki są dostępne poprzez metody tylko do odczytu Cell.getFirstColumnIndex i Cell.getFirstRowIndex. TextFrame.getParentCell także zapewnia nawigację tylko do odczytu: zwraca właściciela, ale nie zmienia własności. Zawsze sprawdzaj, czy zwrócona komórka nie jest None, zanim ją użyjesz.

Pełny przykład identyfikujący właścicieli komórek tabeli i kształtów, w tym kształty powiązane z węzłami SmartArt, znajdziesz w Search and Replace Text.

Wyrównywanie tekstu w tabeli

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu po jego indeksie.
  3. Dodaj obiekt Table do slajdu.
  4. Uzyskaj dostęp do obiektu TextFrame z tabeli.
  5. Uzyskaj dostęp do Paragraph obiektu TextFrame.
  6. Wyrównaj tekst pionowo.
  7. Zapisz zmodyfikowaną prezentację.

Ten kod w Pythonie pokazuje, jak wyrównać tekst w tabeli:

import jpype
import asposeslides

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

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

# Tworzy instancję klasy Presentation
presentation = Presentation()
try:

    # Pobiera pierwszy slajd
    slide = presentation.getSlides().get_Item(0)

    # Definiuje kolumny o określonych szerokościach i wiersze o określonych wysokościach
    column_widths = [120, 120, 120, 120]
    row_heights = [100, 100, 100, 100]

    # Dodaje kształt tabeli do slajdu
    table = slide.getShapes().addTable(100, 50, column_widths, row_heights)
    table.get_Item(1, 0).getTextFrame().setText("10")
    table.get_Item(2, 0).getTextFrame().setText("20")
    table.get_Item(3, 0).getTextFrame().setText("30")

    # Uzyskuje dostęp do ramki tekstowej
    text_frame = table.get_Item(0, 0).getTextFrame()

    # Uzyskuje dostęp do pierwszego akapitu w ramce tekstowej.
    paragraph = text_frame.getParagraphs().get_Item(0)

    # Uzyskuje dostęp do pierwszej części w akapicie.
    portion = paragraph.getPortions().get_Item(0)
    portion.setText("Text here")
    portion.getPortionFormat().getFillFormat().setFillType(FillType.Solid)
    portion.getPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK)

    # Wyrównuje tekst pionowo
    cell = table.get_Item(0, 0)
    cell.setTextAnchorType(TextAnchorType.Center)
    cell.setTextVerticalType(TextVerticalType.Vertical270)

    # Zapisuje prezentację na dysku
    presentation.save("Vertical_Align_Text_out.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Ustaw formatowanie tekstu na poziomie tabeli

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu po jego indeksie.
  3. Uzyskaj dostęp do obiektu Table ze slajdu.
  4. Ustaw wysokość czcionki tekstu przy pomocy setFontHeight.
  5. Ustaw wyrównanie i prawy margines przy pomocy setAlignment oraz setMarginRight.
  6. Ustaw pionowy typ tekstu przy pomocy setTextVerticalType.
  7. Zapisz zmodyfikowaną prezentację.

Ten kod w Pythonie pokazuje, jak zastosować wybrane opcje formatowania do tekstu w tabeli:

import jpype
import asposeslides

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

from asposeslides.api import ParagraphFormat, PortionFormat, Presentation, SaveFormat, TextAlignment, TextFrameFormat, TextVerticalType, Table

# Tworzy instancję klasy Presentation
presentation = Presentation("simpletable.pptx")
try:

    # Załóżmy, że pierwszy kształt na pierwszym slajdzie jest tabelą
    shape = presentation.getSlides().get_Item(0).getShapes().get_Item(0)
    if isinstance(shape, Table):
        table = shape

        # Ustawia wysokość czcionki komórek tabeli
        portion_format = PortionFormat()
        portion_format.setFontHeight(25)
        table.setTextFormat(portion_format)

        # Ustawia wyrównanie tekstu i prawy margines komórek tabeli w jednym wywołaniu
        paragraph_format = ParagraphFormat()
        paragraph_format.setAlignment(TextAlignment.Right)
        paragraph_format.setMarginRight(20)
        table.setTextFormat(paragraph_format)

        # Ustawia pionowy typ tekstu komórek tabeli
        text_frame_format = TextFrameFormat()
        text_frame_format.setTextVerticalType(TextVerticalType.Vertical)
        table.setTextFormat(text_frame_format)
        presentation.save("result.pptx", SaveFormat.Pptx)
    else:
        print("The first shape is not a table.")
finally:
    presentation.dispose()

Pobieranie właściwości stylu tabeli

Aspose.Slides pozwala pobrać właściwości stylu tabeli, aby można było wykorzystać te informacje w innej tabeli lub w innym miejscu. Ten kod w Pythonie pokazuje, jak uzyskać właściwości stylu z predefiniowanego stylu tabeli:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, TableStylePreset

presentation = Presentation()
try:
    table = presentation.getSlides().get_Item(0).getShapes().addTable(10, 10, [100, 150], [5, 5, 5])
    table.setStylePreset(TableStylePreset.DarkStyle1)  # zmień domyślny styl tabeli

    # Pobiera preset stylu tabeli
    style_preset = table.getStylePreset()
    print("Table style preset: ", style_preset)

    # Zastosuj pobrany preset stylu do innej tabeli
    another_table = presentation.getSlides().get_Item(0).getShapes().addTable(10, 100, [100, 150], [5, 5, 5])
    another_table.setStylePreset(style_preset)
    presentation.save("table.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Zablokowanie proporcji tabeli

Proporcja geometrycznego kształtu to stosunek jego wymiarów w różnych wymiarach. Aspose.Slides udostępnia metodę setAspectRatioLocked, aby umożliwić zablokowanie ustawienia proporcji dla tabel i innych kształtów.

Ten kod w Pythonie pokazuje, jak zablokować proporcje tabeli:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, Table

presentation = Presentation("pres.pptx")
try:
    shape = presentation.getSlides().get_Item(0).getShapes().get_Item(0)
    if isinstance(shape, Table):
        table = shape
        print("Lock aspect ratio set: ", table.getGraphicalObjectLock().getAspectRatioLocked())
        table.getGraphicalObjectLock().setAspectRatioLocked(not table.getGraphicalObjectLock().getAspectRatioLocked())  # odwróć
        print("Lock aspect ratio set: ", table.getGraphicalObjectLock().getAspectRatioLocked())
        presentation.save("pres-out.pptx", SaveFormat.Pptx)
    else:
        print("The first shape is not a table.")
finally:
    presentation.dispose()

FAQ

Czy mogę włączyć kierunek odczytu od prawej do lewej (RTL) dla całej tabeli i tekstu w jej komórkach?

Tak. Tabela udostępnia metodę setRightToLeft, a akapity mają ParagraphFormat.setRightToLeft. Użycie obu zapewnia prawidłowy porządek RTL i renderowanie wewnątrz komórek.

Jak mogę uniemożliwić użytkownikom przenoszenie lub zmianę rozmiaru tabeli w finalnym pliku?

Użyj shape locks, aby wyłączyć przenoszenie, zmianę rozmiaru, zaznaczanie itp. Te blokady działają również na tabele.

Czy wstawianie obrazu wewnątrz komórki jako tła jest obsługiwane?

Tak. Możesz ustawić picture fill dla komórki; obraz pokryje obszar komórki zgodnie z wybranym trybem (rozciąganie lub kafelkowanie).