Gestisci tabelle di presentazione in Python
Introduzione
Le tabelle in PowerPoint organizzano le informazioni in righe e colonne, facilitando la lettura e il confronto dei valori.
Aspose.Slides fornisce le classi Table e Cell e altri tipi per consentire di creare, aggiornare e gestire le tabelle nelle presentazioni.
Crea una tabella da zero
Crea una tabella specificando la sua posizione, le larghezze delle colonne e le altezze delle righe. Dopo averla aggiunta a una diapositiva, è possibile formattare i bordi delle celle, unire le celle e inserire testo.
- Crea un’istanza della classe Presentation.
- Ottieni un riferimento alla diapositiva tramite il suo indice.
- Definisci un elenco di larghezze delle colonne in punti.
- Definisci un elenco di altezze delle righe in punti.
- Aggiungi un oggetto Table alla diapositiva tramite il metodo addTable.
- Itera su ciascun Cell per applicare la formattazione ai bordi superiore, inferiore, destro e sinistro.
- Unisci le prime due celle della prima riga della tabella.
- Accedi alla cella unita tramite il suo metodo getTextFrame.
- Imposta il testo nella cella unita.
- Salva la presentazione modificata.
L’esempio seguente crea una tabella con tre colonne e cinque righe in (100, 50) punti. Applica bordi rossi con una larghezza di 5 punti, unisce le prime due celle della prima riga e salva il risultato come 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()
Numerazione in una tabella standard
In una tabella standard, gli indici delle celle sono basati su zero e usano l’ordine (colonna, riga). La prima cella è indicizzata come (0, 0).
Ad esempio, le celle in una tabella con 4 colonne e 4 righe sono numerate in questo modo:
| (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) |
Questo esempio crea la tabella 4 × 4 illustrata sopra, con larghezze delle colonne e altezze delle righe di 70 punti e bordi delle celle rossi con una larghezza di 5 punti. Le coordinate illustrano gli indici delle celle; l’esempio lascia le celle vuote e salva la tabella come 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()
Accedi a una tabella esistente
Le tabelle sono memorizzate nella collezione di forme di una diapositiva. Itera attraverso le forme per individuare una tabella, quindi utilizza la classe Table per leggere o aggiornare le sue celle.
- Carica la presentazione utilizzando la classe Presentation.
- Ottieni un riferimento alla diapositiva contenente la tabella tramite il suo indice.
- Itera attraverso gli oggetti Shape e interrompi quando trovi una tabella. Se la diapositiva contiene diverse tabelle, usa getAlternativeText per identificare quella necessaria.
- Aggiorna il testo nella cella target.
- Salva la presentazione modificata.
L’esempio seguente apre UpdateExistingTable.pptx e trova la prima tabella nella prima diapositiva. Imposta la cella alla colonna 0, riga 1 su New e salva il risultato come table1_out.pptx. L’input deve contenere almeno una diapositiva, e la prima tabella su quella diapositiva deve avere almeno una colonna e due righe.
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()
Per ridimensionare una riga in una tabella esistente e capire perché la sua altezza reale può superare il minimo richiesto, consulta Controllo altezza riga.
Trova la cella che possiede un TextFrame
Quando il codice generico di elaborazione testo riceve un TextFrame da una tabella, usa il metodo TextFrame.getParentCell per recuperare la Cell proprietaria. Per un TextFrame di una cella di tabella, TextFrame.getParentCell restituisce il proprietario e TextFrame.getParentShape restituisce None, anche se la tabella stessa è una forma.
Le coordinate della cella sono disponibili tramite i metodi di sola lettura Cell.getFirstColumnIndex e Cell.getFirstRowIndex. TextFrame.getParentCell fornisce anche una navigazione di sola lettura: restituisce il proprietario ma non ne modifica la proprietà. Verifica sempre che la cella restituita non sia None prima di usarla.
Per un esempio completo che identifica proprietari di celle di tabella e di forme, incluse le forme associate a nodi SmartArt, vedi Cerca e sostituisci testo.
Allinea il testo in una tabella
È possibile controllare l’ancoraggio verticale e la direzione del testo delle singole celle di una tabella. L’esempio in questa sezione centra il testo nella prima cella e lo ruota di 270 gradi.
- Crea un’istanza della classe Presentation.
- Ottieni un riferimento alla diapositiva tramite il suo indice.
- Aggiungi un oggetto Table alla diapositiva.
- Accedi a un oggetto TextFrame dalla tabella.
- Accedi al primo Paragraph e imposta il suo testo e colore.
- Imposta l’ancoraggio verticale della cella e la direzione del testo usando setTextAnchorType e setTextVerticalType.
- Salva la presentazione modificata.
Questo esempio crea una tabella 4 × 4 con larghezze delle colonne di 120 punti e altezze delle righe di 100 punti. Formattta il testo nella cella (0, 0), aggiunge valori alle restanti celle della prima riga e salva il risultato come 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()
Imposta la formattazione del testo a livello di tabella
Usa setTextFormat per applicare la formattazione del testo a tutte le celle di una tabella. Le sue sovraccariche accettano la formattazione di porzione, paragrafo e TextFrame, così è possibile impostare queste proprietà senza iterare attraverso le singole celle.
- Carica la presentazione utilizzando la classe Presentation.
- Ottieni un riferimento alla diapositiva tramite il suo indice.
- Accedi a un oggetto Table dalla diapositiva.
- Imposta la dimensione del carattere usando setFontHeight per il testo.
- Imposta l’allineamento del paragrafo e il margine destro usando setAlignment e setMarginRight.
- Imposta la direzione del testo usando setTextVerticalType.
- Salva la presentazione modificata.
L’esempio seguente apre table.pptx, che deve contenere almeno una diapositiva con una tabella come prima forma. Imposta la dimensione del carattere a 25 punti, allinea a destra i paragrafi con un margine destro di 20 punti e rende il testo verticale. La presentazione formattata viene salvata come 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()
Ottieni le proprietà dello stile della tabella
Usa getStylePreset per leggere lo stile predefinito di una tabella e setStylePreset per assegnarlo. Questo esempio applica TableStylePreset.DarkStyle1 a una tabella, stampa il valore predefinito e assegna lo stesso stile a una seconda tabella. Entrambe le tabelle vengono salvate in 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()
Blocca il rapporto di aspetto di una tabella
Il rapporto di aspetto di una tabella è il rapporto tra la sua larghezza e la sua altezza. Usa setAspectRatioLocked per bloccare questo rapporto per una tabella.
L’esempio seguente apre pres.pptx, che deve contenere almeno una diapositiva con una tabella come prima forma. Stampa lo stato di blocco attuale, abilita il blocco del rapporto di aspetto, stampa lo stato aggiornato (True) e salva il risultato come 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
Posso abilitare la direzione di lettura da destra a sinistra (RTL) per un’intera tabella e il testo nelle sue celle?
Sì. La tabella espone un metodo setRightToLeft, e i paragrafi hanno ParagraphFormat.setRightToLeft. L’utilizzo di entrambi garantisce l’ordine RTL corretto e il rendering all’interno delle celle.
Come posso impedire agli utenti di spostare o ridimensionare una tabella nel file finale?
Utilizza shape locks per disabilitare lo spostamento, il ridimensionamento, la selezione, ecc. Questi blocchi si applicano anche alle tabelle.
L’inserimento di un’immagine all’interno di una cella come sfondo è supportato?
Sì. È possibile impostare un picture fill per una cella; l’immagine coprirà l’area della cella secondo la modalità scelta (allungamento o affiancamento).