Управление таблицами презентаций в Python

Введение

Таблица в PowerPoint — эффективный способ отображения информации. Информация в сетке ячеек (расположенных в строках и столбцах) представлена просто и легко понятна.

Aspose.Slides предоставляет класс Table класс Cell и другие типы, позволяющие создавать, обновлять и управлять таблицами во всех типах презентаций.

Создание таблицы с нуля

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на слайд по его индексу.
  3. Определите список ширин столбцов.
  4. Определите список высот строк.
  5. Добавьте объект Table на слайд с помощью метода addTable.
  6. Итерируйтесь по каждой Cell чтобы применить форматирование к верхней, нижней, правой и левой границам.
  7. Объедините первые две ячейки первой строки таблицы.
  8. Получите доступ к TextFrame ячейки Cell.
  9. Добавьте некоторый текст в TextFrame.
  10. Сохраните изменённую презентацию.

Этот код на 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()

Доступ к существующей таблице

  1. Создайте экземпляр класса Presentation.

  2. Получите ссылку на слайд, содержащий таблицу, по его индексу.

  3. Инициализируйте переменную для объекта Table и установите её в None.

  4. Итерируйтесь по всем объектам Shape до тех пор, пока не будет найдена таблица.

    Если вы подозреваете, что обрабатываемый слайд содержит одну таблицу, можете просто проверить все содержащиеся в нём фигуры. Когда фигура определяется как таблица, вы можете использовать её как объект Table. Однако если на слайде несколько таблиц, лучше искать нужную таблицу по её getAlternativeText.

  5. Используйте объект Table чтобы работать с таблицей. В приведённом ниже примере мы обновляем текст в первом столбце второй строки.

  6. Сохраните изменённую презентацию.

Этот код на 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.

Выравнивание текста в таблице

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на слайд по его индексу.
  3. Добавьте объект Table на слайд.
  4. Получите объект TextFrame из таблицы.
  5. Получите Paragraph объекта TextFrame.
  6. Выравняйте текст по вертикали.
  7. Сохраните изменённую презентацию.

Этот код на 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()

Установка форматирования текста на уровне таблицы

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на слайд по его индексу.
  3. Получите объект Table со слайда.
  4. Установите высоту шрифта текста с помощью setFontHeight.
  5. Установите выравнивание и правый отступ с помощью setAlignment и setMarginRight.
  6. Установите вертикальный тип текста с помощью setTextVerticalType.
  7. Сохраните изменённую презентацию.

Этот код на 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 для ячейки; изображение будет покрывать область ячейки в соответствии с выбранным режимом (растягивание или замощение).