Zarządzanie tabelami w prezentacji w Pythonie
Wprowadzenie
Tabele w programie PowerPoint organizują informacje w wierszach i kolumnach, co ułatwia ich odczyt i porównywanie wartości.
Aspose.Slides udostępnia klasy Tabela i Komórka oraz inne typy, które pozwalają tworzyć, aktualizować i zarządzać tabelami w prezentacjach.
Utworzenie tabeli od podstaw
Utwórz tabelę, określając jej pozycję, szerokości kolumn i wysokości wierszy. Po dodaniu jej do slajdu możesz formatować obramowania komórek, scalać komórki i wstawiać tekst.
- Utwórz instancję klasy Prezentacja.
- Pobierz odwołanie do slajdu po jego indeksie.
- Zdefiniuj listę szerokości kolumn w punktach.
- Zdefiniuj listę wysokości wierszy w punktach.
- Dodaj obiekt Tabela do slajdu przez metodę addTable.
- Przejdź przez każdą Komórka i zastosuj formatowanie górnych, dolnych, prawych i lewych obramowań.
- Scal pierwsze dwa pola w pierwszym wierszu tabeli.
- Uzyskaj dostęp do scalonej komórki przez metodę getTextFrame.
- Ustaw tekst w scalonej komórce.
- Zapisz zmodyfikowaną prezentację.
Poniższy przykład tworzy tabelę z trzema kolumnami i pięcioma wierszami w punkcie (100, 50). Stosuje czerwone obramowania o szerokości 5 punktów, scala pierwsze dwa pola w pierwszym wierszu i zapisuje wynik jako table.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import FillType, Presentation, SaveFormat
from java.awt import Color
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
column_widths = [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_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)
table.mergeCells(table.get_Item(0, 0), table.get_Item(1, 0), False)
table.get_Item(0, 0).getTextFrame().setText("Merged Cells")
presentation.save("table.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Numeracja w standardowej tabeli
W standardowej tabeli indeksy komórek zaczynają się od zera i używają kolejności (kolumna, wiersz). Pierwsza komórka ma indeks (0, 0).
Na przykład komórki w tabeli z 4 kolumnami i 4 wierszami są numerowane w ten 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 przykład tworzy tabelę 4 × 4 przedstawioną powyżej, ze szerokościami kolumn i wysokościami wierszy po 70 punktów oraz czerwonymi obramowaniami o szerokości 5 punktów. Współrzędne ilustrują indeksy komórek; przykład pozostawia komórki puste i zapisuje tabelę jako StandardTables_out.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import FillType, Presentation, SaveFormat
from java.awt import Color
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)
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)
presentation.save("StandardTables_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Dostęp do istniejącej tabeli
Tabele są przechowywane w kolekcji kształtów slajdu. Przejrzyj kształty, aby znaleźć tabelę, a następnie użyj klasy Tabela, aby odczytać lub zaktualizować jej komórki.
- Wczytaj prezentację przy użyciu klasy Prezentacja.
- Pobierz odwołanie do slajdu zawierającego tabelę po jego indeksie.
- Przejrzyj obiekty Kształt i zatrzymaj się, gdy znajdziesz tabelę. Jeśli slajd zawiera kilka tabel, użyj getAlternativeText, aby zidentyfikować potrzebną.
- Zaktualizuj tekst w docelowej komórce.
- Zapisz zmodyfikowaną prezentację.
Poniższy przykład otwiera UpdateExistingTable.pptx i znajduje pierwszą tabelę na pierwszym slajdzie. Ustawia komórkę w kolumnie 0, wierszu 1 na New i zapisuje wynik jako table1_out.pptx. Plik wejściowy musi zawierać co najmniej jeden slajd, a pierwsza tabela na tym slajdzie musi mieć co najmniej jedną kolumnę i dwa wiersze.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat, Table
presentation = Presentation("UpdateExistingTable.pptx")
try:
slide = presentation.getSlides().get_Item(0)
table = None
for shape in slide.getShapes():
if isinstance(shape, Table):
table = shape
break
if table is not None:
table.get_Item(0, 1).getTextFrame().setText("New")
presentation.save("table1_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Aby zmienić rozmiar wiersza w istniejącej tabeli i zrozumieć, dlaczego jego rzeczywista wysokość może przekraczać wymaganą minimalną, zobacz Kontroluj wysokość wiersza.
Znajdowanie komórki, której właścicielem jest ramka tekstowa
Gdy ogólny kod przetwarzający tekst otrzyma obiekt TextFrame z tabeli, użyj metody TextFrame.getParentCell, aby uzyskać właściciela – Komórka. Dla ramki tekstowej komórki tabeli metoda 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 przez tylko do odczytu metody Cell.getFirstColumnIndex oraz Cell.getFirstRowIndex. Metoda TextFrame.getParentCell zapewnia również 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, znajduje się w Wyszukaj i zamień tekst.
Wyrównanie tekstu w tabeli
Możesz kontrolować pionowe zakotwiczenie i kierunek tekstu w poszczególnych komórkach tabeli. Przykład w tej sekcji centruje tekst w pierwszej komórce i obraca go o 270 stopni.
- Utwórz instancję klasy Prezentacja.
- Pobierz odwołanie do slajdu po jego indeksie.
- Dodaj obiekt Tabela do slajdu.
- Uzyskaj dostęp do obiektu TextFrame z tabeli.
- Uzyskaj dostęp do pierwszego Akapitu i ustaw jego tekst oraz kolor.
- Ustaw pionowe zakotwiczenie komórki i kierunek tekstu przy użyciu setTextAnchorType oraz setTextVerticalType.
- Zapisz zmodyfikowaną prezentację.
Ten przykład tworzy tabelę 4 × 4 o szerokościach kolumn 120 punktów i wysokościach wierszy 100 punktów. Formatuje tekst w komórce (0, 0), dodaje wartości do pozostałych komórek w pierwszym wierszu i zapisuje wynik jako Vertical_Align_Text_out.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import FillType, Presentation, SaveFormat, TextAnchorType, TextVerticalType
from java.awt import Color
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
column_widths = [120, 120, 120, 120]
row_heights = [100, 100, 100, 100]
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")
text_frame = table.get_Item(0, 0).getTextFrame()
paragraph = text_frame.getParagraphs().get_Item(0)
portion = paragraph.getPortions().get_Item(0)
portion.setText("Text here")
portion.getPortionFormat().getFillFormat().setFillType(FillType.Solid)
portion.getPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK)
cell = table.get_Item(0, 0)
cell.setTextAnchorType(TextAnchorType.Center)
cell.setTextVerticalType(TextVerticalType.Vertical270)
presentation.save("Vertical_Align_Text_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Ustawienie formatowania tekstu na poziomie tabeli
Użyj setTextFormat, aby zastosować formatowanie tekstu we wszystkich komórkach tabeli. Przeciążenia akceptują formatowanie fragmentu, akapitu i ramki tekstowej, więc możesz ustawiać te właściwości bez iteracji po poszczególnych komórkach.
- Wczytaj prezentację przy użyciu klasy Prezentacja.
- Pobierz odwołanie do slajdu po jego indeksie.
- Uzyskaj dostęp do obiektu Tabela ze slajdu.
- Ustaw rozmiar czcionki przy użyciu setFontHeight dla tekstu.
- Ustaw wyrównanie akapitu i prawy margines przy użyciu setAlignment oraz setMarginRight.
- Ustaw kierunek tekstu przy użyciu setTextVerticalType.
- Zapisz zmodyfikowaną prezentację.
Poniższy przykład otwiera table.pptx, który musi zawierać co najmniej jeden slajd z tabelą jako pierwszym kształtem. Ustawia rozmiar czcionki na 25 punktów, wyrównuje akapity do prawej z prawym marginesem 20 punktów i zmienia tekst na pionowy. Sformatowaną prezentację zapisuje jako result.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ParagraphFormat, PortionFormat, Presentation, SaveFormat, TextAlignment, TextFrameFormat, TextVerticalType, Table
presentation = Presentation("table.pptx")
try:
slide = presentation.getSlides().get_Item(0)
table = slide.getShapes().get_Item(0)
portion_format = PortionFormat()
portion_format.setFontHeight(25)
table.setTextFormat(portion_format)
paragraph_format = ParagraphFormat()
paragraph_format.setAlignment(TextAlignment.Right)
paragraph_format.setMarginRight(20)
table.setTextFormat(paragraph_format)
text_frame_format = TextFrameFormat()
text_frame_format.setTextVerticalType(TextVerticalType.Vertical)
table.setTextFormat(text_frame_format)
presentation.save("result.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Pobieranie właściwości stylu tabeli
Użyj getStylePreset, aby odczytać wstępnie ustawiony styl tabeli, oraz setStylePreset, aby go przypisać. Ten przykład stosuje TableStylePreset.DarkStyle1 do jednej tabeli, wypisuje wartość presetu i przypisuje ten sam preset drugiej tabeli. Obie tabele są zapisywane w table-style.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat, TableStylePreset
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
column_widths = [100, 150]
row_heights = [5, 5, 5]
table = slide.getShapes().addTable(10, 10, column_widths, row_heights)
table.setStylePreset(TableStylePreset.DarkStyle1)
style_preset = table.getStylePreset()
print("Table style preset: ", style_preset)
another_table = slide.getShapes().addTable(10, 100, column_widths, row_heights)
another_table.setStylePreset(style_preset)
presentation.save("table-style.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Zablokowanie proporcji tabeli
Proporcje tabeli to stosunek jej szerokości do wysokości. Użyj setAspectRatioLocked, aby zablokować ten stosunek dla tabeli.
Poniższy przykład otwiera pres.pptx, który musi zawierać co najmniej jeden slajd z tabelą jako pierwszym kształtem. Wypisuje bieżący stan blokady, włącza blokadę proporcji, wypisuje zaktualizowany stan (True) i zapisuje wynik jako pres-out.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat, Table
presentation = Presentation("pres.pptx")
try:
slide = presentation.getSlides().get_Item(0)
table = slide.getShapes().get_Item(0)
print("Lock aspect ratio set: ", table.getGraphicalObjectLock().getAspectRatioLocked())
table.getGraphicalObjectLock().setAspectRatioLocked(True)
print("Lock aspect ratio set: ", table.getGraphicalObjectLock().getAspectRatioLocked())
presentation.save("pres-out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
FAQ
Czy mogę włączyć kierunek czytania 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 pliku końcowym?
Użyj blokad kształtów, aby wyłączyć przenoszenie, zmianę rozmiaru, zaznaczanie itp. Te blokady działają również na tabele.
Czy wstawianie obrazu jako tła w komórce 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).