Управление ячейками таблиц в презентациях с помощью Python
Обзор
Aspose.Slides позволяет получать доступ к ячейкам таблиц в презентациях PowerPoint и изменять их. В этой статье объясняется, как определить объединённые ячейки таблицы, удалить границы ячеек, работать с нумерацией ячеек после объединения или разделения, изменить фон ячейки и добавить изображение внутрь ячейки таблицы. Примеры показывают, как создать или открыть презентацию, получить таблицу со слайда, изменить форматирование ячеек через свойства ячеек и сохранить изменённую презентацию в файл PPTX.
Определение объединённой ячейки таблицы
- Создайте экземпляр класса Presentation.
- Получите таблицу с первого слайда.
- Пройдитесь по строкам и столбцам таблицы, чтобы найти объединённые ячейки.
- Выведите сообщение, когда найдены объединённые ячейки.
Этот код на Python показывает, как определить объединённые ячейки таблицы в презентации:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, Table
presentation = Presentation("SomePresentationWithTable.pptx")
try:
# Предположим, что первая фигура на первом слайде является таблицей.
shape = presentation.getSlides().get_Item(0).getShapes().get_Item(0)
if isinstance(shape, Table):
table = shape
for i in range(table.getRows().size()):
for j in range(table.getColumns().size()):
current_cell = table.getRows().get_Item(i).get_Item(j)
if current_cell.isMergedCell():
print(f"Cell {i};{j} is part of a merged cell with RowSpan={current_cell.getRowSpan()} and ColSpan={current_cell.getColSpan()} starting from Cell {current_cell.getFirstRowIndex()};{current_cell.getFirstColumnIndex()}.")
else:
print("The first shape is not a table.")
finally:
presentation.dispose()
Удаление границ ячеек таблицы
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Определите список ширин столбцов.
- Определите список высот строк.
- Добавьте таблицу на слайд с помощью метода addTable.
- Пройдитесь по каждой ячейке, чтобы очистить верхнюю, нижнюю, правую и левую границы.
- Сохраните изменённую презентацию в файл PPTX.
Этот код на Python показывает, как удалить границы из ячеек таблицы:
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)
# Сохранить презентацию в файл PPTX.
presentation.save("table_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Нумерация в объединённых ячейках
Если мы объединим две пары ячеек, (1, 1) и (2, 1), а также (1, 2) и (2, 2), полученная таблица сохраняет свою нумерацию ячеек. Этот код на Python демонстрирует процесс:
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 = [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)
# Объединить ячейки (1, 1) и (2, 1).
table.mergeCells(table.get_Item(1, 1), table.get_Item(2, 1), False)
# Объединить ячейки (1, 2) и (2, 2).
table.mergeCells(table.get_Item(1, 2), table.get_Item(2, 2), False)
# Сохранить презентацию в файл PPTX.
presentation.save("MergeCells_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Затем мы продолжаем объединять ячейки, объединяя (1, 1) и (1, 2). В результате получаем таблицу с большой объединённой ячейкой в центре:
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 = [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)
# Объединить ячейки (1, 1) и (2, 1).
table.mergeCells(table.get_Item(1, 1), table.get_Item(2, 1), False)
# Объединить ячейки (1, 2) и (2, 2).
table.mergeCells(table.get_Item(1, 2), table.get_Item(2, 2), False)
# Объединить ячейки (1, 1) и (1, 2).
table.mergeCells(table.get_Item(1, 1), table.get_Item(1, 2), True)
# Сохранить презентацию в файл PPTX.
presentation.save("MergeCells_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Нумерация в разделённой ячейке
В предыдущих примерах объединение ячеек таблицы не меняло нумерацию остальных ячеек.
На этот раз мы берём обычную таблицу (таблицу без объединённых ячеек) и пытаемся разделить ячейку (1, 1), получая особую таблицу. Обратите внимание на нумерацию этой таблицы — она может показаться странной. Однако так Microsoft PowerPoint нумерует ячейки таблиц, и Aspose.Slides делает то же самое.
Этот код на Python демонстрирует описанный процесс:
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 = [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)
# Разделить ячейку (1, 1).
table.get_Item(1, 1).splitByWidth(table.get_Item(2, 1).getWidth() / 2)
# Сохранить презентацию в файл PPTX.
presentation.save("SplitCells_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Изменение фонового цвета ячейки таблицы
Этот код на Python показывает, как изменить фон ячейки таблицы:
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)
# Сохранить презентацию в файл PPTX.
presentation.save("cell_background_color.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Добавление изображения в ячейку таблицы
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Определите список ширин столбцов.
- Определите список высот строк.
- Добавьте таблицу на слайд с помощью метода addTable.
- Загрузите файл изображения с помощью Images.fromFile.
- Добавьте изображение в презентацию, создав объект PPImage.
- Установите для ячейки таблицы тип заполнения FillFormat — FillType.Picture.
- Добавьте изображение в первую ячейку таблицы.
- Сохраните изменённую презентацию в файл PPTX.
Этот код на Python показывает, как разместить изображение внутри ячейки таблицы при её создании:
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("image.jpg")
try:
picture = presentation.getImages().addImage(image)
finally:
image.dispose()
# Добавить изображение в первую ячейку таблицы.
cell_format = table.get_Item(0, 0).getCellFormat()
cell_format.getFillFormat().setFillType(FillType.Picture)
cell_format.getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch)
cell_format.getFillFormat().getPictureFillFormat().getPicture().setImage(picture)
# Сохранить презентацию в файл PPTX.
presentation.save("Image_In_TableCell_out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
FAQ
Могу ли я задать разную толщину линий и стили для разных сторон одной ячейки?
Да. Границы top/bottom/left/right имеют отдельные свойства, поэтому толщина и стиль каждой стороны могут отличаться. Это логически вытекает из управления границами каждой стороны ячейки, продемонстрированного в статье.
Что происходит с изображением, если я изменю размер столбца/строки после установки картинки в качестве фона ячейки?
Поведение зависит от fill mode (stretch/tile). При растягивании изображение подстраивается под новую ячейку; при замощении плитки пересчитываются. В статье упоминаются режимы отображения изображения в ячейке.
Могу ли я назначить гиперссылку всему содержимому ячейки?
Hyperlinks задаются на уровне текста (части) внутри текстового фрейма ячейки или на уровне всей таблицы/фигуры. На практике вы назначаете ссылку либо части, либо всему тексту в ячейке.
Могу ли я задать разные шрифты внутри одной ячейки?
Да. Текстовый фрейм ячейки поддерживает portions (проснования) с независимым форматированием — семейство шрифта, стиль, размер и цвет.