Управление таблицами презентаций в Python
Введение
Таблица в PowerPoint — эффективный способ отображения информации. Информация в сетке ячеек (расположенных в строках и столбцах) представлена просто и легко понятна.
Aspose.Slides предоставляет класс Table класс Cell и другие типы, позволяющие создавать, обновлять и управлять таблицами во всех типах презентаций.
Создание таблицы с нуля
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Определите список ширин столбцов.
- Определите список высот строк.
- Добавьте объект Table на слайд с помощью метода addTable.
- Итерируйтесь по каждой Cell чтобы применить форматирование к верхней, нижней, правой и левой границам.
- Объедините первые две ячейки первой строки таблицы.
- Получите доступ к TextFrame ячейки Cell.
- Добавьте некоторый текст в TextFrame.
- Сохраните изменённую презентацию.
Этот код на Python демонстрирует, как создать таблицу в презентации:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import FillType, Presentation, SaveFormat
from java.awt import Color
# Создаёт экземпляр класса Presentation, представляющего файл PPTX
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)
# Объединяет ячейки 1 и 2 первой строки
table.mergeCells(table.getRows().get_Item(0).get_Item(0), table.getRows().get_Item(0).get_Item(1), False)
# Добавляет текст в объединённую ячейку
table.getRows().get_Item(0).get_Item(0).getTextFrame().setText("Merged Cells")
# Сохраняет презентацию на диск
presentation.save("table.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Нумерация в стандартной таблице
В стандартной таблице нумерация ячеек проста и начинается с нуля. Первая ячейка в таблице имеет индекс 0,0 (столбец 0, строка 0).
Например, ячейки таблицы с 4 столбцами и 4 строками нумеруются следующим образом:
| (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) |
Этот код на Python демонстрирует, как создать таблицу со стандартной нумерацией ячеек:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import FillType, Presentation, SaveFormat
from java.awt import Color
# Создаёт экземпляр класса Presentation, представляющего файл PPTX
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.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)
# Сохраняет презентацию на диск
presentation.save("StandardTables_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Доступ к существующей таблице
-
Создайте экземпляр класса Presentation.
-
Получите ссылку на слайд, содержащий таблицу, по его индексу.
-
Инициализируйте переменную для объекта Table и установите её в
None. -
Итерируйтесь по всем объектам Shape до тех пор, пока не будет найдена таблица.
Если вы подозреваете, что обрабатываемый слайд содержит одну таблицу, можете просто проверить все содержащиеся в нём фигуры. Когда фигура определяется как таблица, вы можете использовать её как объект Table. Однако если на слайде несколько таблиц, лучше искать нужную таблицу по её getAlternativeText.
-
Используйте объект Table чтобы работать с таблицей. В приведённом ниже примере мы обновляем текст в первом столбце второй строки.
-
Сохраните изменённую презентацию.
Этот код на Python демонстрирует, как получить доступ к существующей таблице и работать с ней:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat, Table
# Создаёт экземпляр класса Presentation, представляющего файл PPTX
presentation = Presentation("UpdateExistingTable.pptx")
try:
# Получает первый слайд
slide = presentation.getSlides().get_Item(0)
# Инициализирует ссылку на таблицу.
table = None
# Проходит по фигурам и задаёт ссылку на найденную таблицу
for shape in slide.getShapes():
if isinstance(shape, Table):
table = shape
# Устанавливает текст для первого столбца второй строки
table.get_Item(0, 1).getTextFrame().setText("New")
# Сохраняет изменённую презентацию на диск
presentation.save("table1_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Найти ячейку, которой принадлежит TextFrame
Когда общий код обработки текста получает TextFrame из таблицы, используйте метод TextFrame.getParentCell, чтобы получить принадлежащую Cell. Для текстового фрейма ячейки таблицы TextFrame.getParentCell возвращает владельца, а TextFrame.getParentShape возвращает None, хотя сама таблица является фигурой.
Координаты ячейки доступны через только для чтения методы Cell.getFirstColumnIndex и Cell.getFirstRowIndex. TextFrame.getParentCell также предоставляет только для чтения навигацию: он возвращает владельца, но не меняет владение. Всегда проверяйте полученную ячейку на None перед её использованием.
Для полного примера, определяющего владельцев ячеек таблицы и фигур, включая фигуры, связанные с узлами SmartArt, см. Search and Replace Text.
Выравнивание текста в таблице
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Добавьте объект Table на слайд.
- Получите объект TextFrame из таблицы.
- Получите Paragraph объекта TextFrame.
- Выравняйте текст по вертикали.
- Сохраните изменённую презентацию.
Этот код на Python демонстрирует, как выровнять текст в таблице:
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 = 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()
Установка форматирования текста на уровне таблицы
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Получите объект Table со слайда.
- Установите высоту шрифта текста с помощью setFontHeight.
- Установите выравнивание и правый отступ с помощью setAlignment и setMarginRight.
- Установите вертикальный тип текста с помощью setTextVerticalType.
- Сохраните изменённую презентацию.
Этот код на Python демонстрирует, как применить выбранные параметры форматирования к тексту в таблице:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ParagraphFormat, PortionFormat, Presentation, SaveFormat, TextAlignment, TextFrameFormat, TextVerticalType, Table
# Создаёт экземпляр класса Presentation
presentation = Presentation("simpletable.pptx")
try:
# Предположим, что первая фигура на первом слайде — это таблица
shape = presentation.getSlides().get_Item(0).getShapes().get_Item(0)
if isinstance(shape, Table):
table = shape
# Устанавливает высоту шрифта ячеек таблицы
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)
else:
print("The first shape is not a table.")
finally:
presentation.dispose()
Получение свойств стиля таблицы
Aspose.Slides позволяет получить свойства стиля таблицы, чтобы вы могли использовать эту информацию для другой таблицы или в другом месте. Этот код на Python демонстрирует, как получить свойства стиля из предустановленного стиля таблицы:
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) # изменить тему предустановочного стиля по умолчанию
# Получает предустановку стиля таблицы
style_preset = table.getStylePreset()
print("Table style preset: ", style_preset)
# Применяет полученную предустановку стиля к другой таблице
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()
Блокировка соотношения сторон таблицы
Соотношение сторон геометрической формы — это отношение её размеров в разных измерениях. Aspose.Slides предоставляет метод setAspectRatioLocked, позволяющий заблокировать настройку соотношения сторон для таблиц и других фигур.
Этот код на Python демонстрирует, как заблокировать соотношение сторон для таблицы:
import jpype
import asposeslides
if not jpage.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()) # инвертировать
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
Могу ли я включить направление чтения справа налево (RTL) для всей таблицы и текста в её ячейках?
Да. Таблица предоставляет метод setRightToLeft, а у абзацев есть ParagraphFormat.setRightToLeft. Использование обоих обеспечивает правильный порядок RTL и отображение внутри ячеек.
Как можно предотвратить перемещение или изменение размера таблицы в конечном файле?
Используйте shape locks для отключения перемещения, изменения размеров, выделения и т.д. Эти блокировки применимы и к таблицам.
Поддерживается ли вставка изображения в ячейку в качестве фона?
Да. Вы можете задать picture fill для ячейки; изображение будет покрывать область ячейки в соответствии с выбранным режимом (растягивание или замощение).