Управление таблицами презентаций в C++
Введение
Таблицы в PowerPoint упорядочивают информацию в строки и столбцы, упрощая чтение и сравнение значений.
Aspose.Slides предоставляет класс Table, интерфейс ITable, класс Cell, интерфейс ICell и другие типы, позволяющие создавать, обновлять и управлять таблицами в презентациях.
Создание таблицы с нуля
Создайте таблицу, указав её позицию, ширину столбцов и высоту строк. После добавления её на слайд вы можете оформить границы ячеек, объединять ячейки и вставлять текст.
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Определите массив ширин столбцов в пунктах.
- Определите массив высот строк в пунктах.
- Добавьте объект ITable на слайд с помощью метода AddTable.
- Пройдитесь по каждому ICell и примените оформление к верхней, нижней, правой и левой границам.
- Объедините первые две ячейки первой строки таблицы.
- Получите доступ к объединённой ячейке через её метод get_TextFrame.
- Установите текст в объединённой ячейке.
- Сохраните изменённую презентацию.
Пример ниже создаёт таблицу из трёх столбцов и пяти строк в точке (100, 50). Он применяет красные границы шириной 5 пунктов, объединяет первые две ячейки первой строки и сохраняет результат как table.pptx.
#include <DOM/FillType.h>
#include <DOM/IColorFormat.h>
#include <DOM/ILineFillFormat.h>
#include <DOM/ILineFormat.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/Presentation.h>
#include <DOM/Table/ICell.h>
#include <DOM/Table/ICellFormat.h>
#include <DOM/Table/IRow.h>
#include <DOM/Table/IRowCollection.h>
#include <DOM/Table/ITable.h>
#include <Export/SaveFormat.h>
#include <drawing/color.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System::Drawing;
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto columnWidths = System::MakeArray<double>({ 50, 50, 50 });
auto rowHeights = System::MakeArray<double>({ 50, 30, 30, 30, 30 });
auto table = slide->get_Shapes()->AddTable(100.0f, 50.0f, columnWidths, rowHeights);
for (const auto& row : table->get_Rows())
{
for (const auto& cell : row)
{
auto cellFormat = cell->get_CellFormat();
cellFormat->get_BorderTop()->get_FillFormat()->set_FillType(FillType::Solid);
cellFormat->get_BorderTop()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());
cellFormat->get_BorderTop()->set_Width(5);
cellFormat->get_BorderBottom()->get_FillFormat()->set_FillType(FillType::Solid);
cellFormat->get_BorderBottom()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());
cellFormat->get_BorderBottom()->set_Width(5);
cellFormat->get_BorderLeft()->get_FillFormat()->set_FillType(FillType::Solid);
cellFormat->get_BorderLeft()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());
cellFormat->get_BorderLeft()->set_Width(5);
cellFormat->get_BorderRight()->get_FillFormat()->set_FillType(FillType::Solid);
cellFormat->get_BorderRight()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());
cellFormat->get_BorderRight()->set_Width(5);
}
}
table->MergeCells(table->idx_get(0, 0), table->idx_get(1, 0), false);
table->idx_get(0, 0)->get_TextFrame()->set_Text(u"Merged Cells");
presentation->Save(u"table.pptx", SaveFormat::Pptx);
Нумерация в стандартной таблице
В стандартной таблице индексы ячеек нумеруются с нуля и используют порядок (столбец, строка). Первая ячейка имеет индекс (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) |
Этот пример создаёт 4 × 4 таблицу, изображённую выше, с шириной столбцов и высотой строк по 70 пунктов и красными границами ячеек шириной 5 пунктов. Координаты показывают индексы ячеек; пример оставляет ячейки пустыми и сохраняет таблицу как StandardTables_out.pptx.
#include <DOM/FillType.h>
#include <DOM/IColorFormat.h>
#include <DOM/IFillFormat.h>
#include <DOM/ILineFillFormat.h>
#include <DOM/ILineFormat.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/Table/ICell.h>
#include <DOM/Table/ICellFormat.h>
#include <DOM/Table/IRow.h>
#include <DOM/Table/IRowCollection.h>
#include <DOM/Table/ITable.h>
#include <Export/SaveFormat.h>
#include <drawing/color.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System::Drawing;
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto columnWidths = System::MakeArray<double>({ 70, 70, 70, 70 });
auto rowHeights = System::MakeArray<double>({ 70, 70, 70, 70 });
auto table = slide->get_Shapes()->AddTable(100.0f, 50.0f, columnWidths, rowHeights);
for (const auto& row : table->get_Rows())
{
for (const auto& cell : row)
{
auto cellFormat = cell->get_CellFormat();
cellFormat->get_BorderTop()->get_FillFormat()->set_FillType(FillType::Solid);
cellFormat->get_BorderTop()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());
cellFormat->get_BorderTop()->set_Width(5);
cellFormat->get_BorderBottom()->get_FillFormat()->set_FillType(FillType::Solid);
cellFormat->get_BorderBottom()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());
cellFormat->get_BorderBottom()->set_Width(5);
cellFormat->get_BorderLeft()->get_FillFormat()->set_FillType(FillType::Solid);
cellFormat->get_BorderLeft()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());
cellFormat->get_BorderLeft()->set_Width(5);
cellFormat->get_BorderRight()->get_FillFormat()->set_FillType(FillType::Solid);
cellFormat->get_BorderRight()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Red());
cellFormat->get_BorderRight()->set_Width(5);
}
}
presentation->Save(u"StandardTables_out.pptx", SaveFormat::Pptx);
Доступ к существующей таблице
Таблицы хранятся в коллекции фигур слайда. Пройдитесь по фигурам, чтобы найти таблицу, затем используйте интерфейс ITable для чтения или изменения её ячеек.
- Загрузите презентацию с помощью класса Presentation.
- Получите ссылку на слайд, содержащий таблицу, по его индексу.
- Пройдитесь по объектам IShape и остановитесь, когда найдёте таблицу. Если на слайде несколько таблиц, используйте get_AlternativeText для идентификации нужной.
- Обновите текст в целевой ячейке.
- Сохраните изменённую презентацию.
В примере ниже открывается UpdateExistingTable.pptx и находится первая таблица на первом слайде. В ячейку столбца 0, строки 1 записывается New, после чего результат сохраняется как table1_out.pptx. Входной файл должен содержать хотя бы один слайд, и первая таблица на этом слайде должна иметь минимум один столбец и две строки.
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/Presentation.h>
#include <DOM/Table/ICell.h>
#include <DOM/Table/ITable.h>
#include <Export/SaveFormat.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>
#include <system/console.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto presentation = System::MakeObject<Presentation>(u"UpdateExistingTable.pptx");
auto slide = presentation->get_Slide(0);
System::SharedPtr<ITable> table;
for (const auto& shape : System::IterateOver(slide->get_Shapes()))
{
if (System::ObjectExt::Is<ITable>(shape))
{
table = System::ExplicitCast<ITable>(shape);
break;
}
}
if (table != nullptr)
{
table->idx_get(0, 1)->get_TextFrame()->set_Text(u"New");
presentation->Save(u"table1_out.pptx", SaveFormat::Pptx);
}
Чтобы изменить высоту строки в существующей таблице и понять, почему её фактическая высота может превышать запрошенную минимум, см. статью Control Row Height.
Поиск ячейки, содержащей текстовый фрейм
Когда общий код обработки текста получает объект ITextFrame из таблицы, используйте ITextFrame::get_ParentCell для получения принадлежащего ICell. Для текстового фрейма ячейки таблицы ITextFrame::get_ParentCell возвращает владельца, а ITextFrame::get_ParentShape возвращает nullptr, хотя сама таблица является фигурой.
Координаты ячейки доступны через только для чтения свойства ICell::get_FirstColumnIndex и ICell::get_FirstRowIndex. Метод ITextFrame::get_ParentCell также предоставляет навигацию только для чтения: он возвращает владельца, но не меняет владения. Всегда проверяйте возвращаемую ячейку на nullptr перед её использованием.
Полный пример, определяющий владельцев ячеек таблицы и фигур, включая фигуры, связанные с узлами SmartArt, см. в статье Search and Replace Text.
Выравнивание текста в таблице
Можно контролировать вертикальное привязывание и направление текста отдельных ячеек таблицы. Пример в этом разделе центрирует текст в первой ячейке и вращает его на 270 градусов.
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Добавьте объект ITable на слайд.
- Получите объект ITextFrame из таблицы.
- Получите первую IParagraph и задайте её текст и цвет.
- Установите вертикальное привязывание ячейки и направление текста с помощью методов set_TextAnchorType и set_TextVerticalType.
- Сохраните изменённую презентацию.
Этот пример создаёт таблицу 4 × 4 со столбцами шириной 120 пунктов и строками высотой 100 пунктов. Он форматирует текст в ячейке (0, 0), добавляет значения в остальные ячейки первой строки и сохраняет результат как Vertical_Align_Text_out.pptx.
#include <DOM/FillType.h>
#include <DOM/IColorFormat.h>
#include <DOM/IFillFormat.h>
#include <DOM/IParagraph.h>
#include <DOM/IParagraphCollection.h>
#include <DOM/IPortion.h>
#include <DOM/IPortionCollection.h>
#include <DOM/IPortionFormat.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/Presentation.h>
#include <DOM/Table/ICell.h>
#include <DOM/Table/ITable.h>
#include <DOM/TextAnchorType.h>
#include <DOM/TextVerticalType.h>
#include <Export/SaveFormat.h>
#include <drawing/color.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System::Drawing;
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto columnWidths = System::MakeArray<double>({ 120, 120, 120, 120 });
auto rowHeights = System::MakeArray<double>({ 100, 100, 100, 100 });
auto table = slide->get_Shapes()->AddTable(100.0f, 50.0f, columnWidths, rowHeights);
table->idx_get(1, 0)->get_TextFrame()->set_Text(u"10");
table->idx_get(2, 0)->get_TextFrame()->set_Text(u"20");
table->idx_get(3, 0)->get_TextFrame()->set_Text(u"30");
auto cell = table->idx_get(0, 0);
auto paragraph = cell->get_TextFrame()->get_Paragraphs()->idx_get(0);
auto portion = paragraph->get_Portions()->idx_get(0);
portion->set_Text(u"Text here");
portion->get_PortionFormat()->get_FillFormat()->set_FillType(FillType::Solid);
portion->get_PortionFormat()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Black());
cell->set_TextAnchorType(TextAnchorType::Center);
cell->set_TextVerticalType(TextVerticalType::Vertical270);
presentation->Save(u"Vertical_Align_Text_out.pptx", SaveFormat::Pptx);
Установка форматирования текста на уровне таблицы
Используйте SetTextFormat для применения форматирования текста ко всем ячейкам таблицы. Его перегрузки принимают параметры форматирования части, абзаца и текстового фрейма, поэтому вы можете задать эти свойства без перебора отдельных ячеек.
- Загрузите презентацию с помощью класса Presentation.
- Получите ссылку на слайд по его индексу.
- Получите объект ITable со слайда.
- Установите размер шрифта, используя set_FontHeight для текста.
- Задайте выравнивание абзаца и правый отступ с помощью set_Alignment и set_MarginRight.
- Установите направление текста с помощью set_TextVerticalType.
- Сохраните изменённую презентацию.
Пример ниже открывает table.pptx, который должен содержать хотя бы один слайд с таблицей в качестве первой фигуры. Он задаёт размер шрифта 25 пунктов, выравнивает абзацы по правому краю с правым отступом 20 пунктов и делает текст вертикальным. Отформатированная презентация сохраняется как result.pptx.
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ParagraphFormat.h>
#include <DOM/PortionFormat.h>
#include <DOM/Presentation.h>
#include <DOM/Table/ITable.h>
#include <DOM/TextAlignment.h>
#include <DOM/TextFrameFormat.h>
#include <DOM/TextVerticalType.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto presentation = System::MakeObject<Presentation>(u"table.pptx");
auto slide = presentation->get_Slide(0);
auto table = System::ExplicitCast<ITable>(slide->get_Shape(0));
auto portionFormat = System::MakeObject<PortionFormat>();
portionFormat->set_FontHeight(25.0f);
table->SetTextFormat(portionFormat);
auto paragraphFormat = System::MakeObject<ParagraphFormat>();
paragraphFormat->set_Alignment(TextAlignment::Right);
paragraphFormat->set_MarginRight(20.0f);
table->SetTextFormat(paragraphFormat);
auto textFrameFormat = System::MakeObject<TextFrameFormat>();
textFrameFormat->set_TextVerticalType(TextVerticalType::Vertical);
table->SetTextFormat(textFrameFormat);
presentation->Save(u"result.pptx", SaveFormat::Pptx);
Получение свойств стиля таблицы
Используйте get_StylePreset для чтения предустановленного стиля таблицы и set_StylePreset для его назначения. Этот пример применяет TableStylePreset::DarkStyle1 к одной таблице, выводит имя предустановки и назначает тот же стиль второй таблице. Обе таблицы сохраняются в table-style.pptx.
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/Table/ITable.h>
#include <DOM/TableStylePreset.h>
#include <Export/SaveFormat.h>
#include <system/console.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto columnWidths = System::MakeArray<double>({ 100, 150 });
auto rowHeights = System::MakeArray<double>({ 5, 5, 5 });
auto table = slide->get_Shapes()->AddTable(10, 10, columnWidths, rowHeights);
table->set_StylePreset(TableStylePreset::DarkStyle1);
auto stylePreset = table->get_StylePreset();
System::Console::WriteLine(u"Table style preset: {0}", stylePreset);
auto anotherTable = slide->get_Shapes()->AddTable(10, 100, columnWidths, rowHeights);
anotherTable->set_StylePreset(stylePreset);
presentation->Save(u"table-style.pptx", SaveFormat::Pptx);
Блокировка пропорций таблицы
Пропорции таблицы — это отношение её ширины к высоте. Используйте set_AspectRatioLocked для блокировки этого отношения у таблицы.
Пример ниже открывает pres.pptx, который должен содержать хотя бы один слайд с таблицей в качестве первой фигуры. Он выводит текущее состояние блокировки, включаю блокировку пропорций, выводит обновлённое состояние (True) и сохраняет результат как pres-out.pptx.
#include <DOM/IGraphicalObjectLock.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/Table/ITable.h>
#include <Export/SaveFormat.h>
#include <system/console.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = System::MakeObject<Presentation>(u"pres.pptx");
auto slide = presentation->get_Slide(0);
auto table = System::ExplicitCast<ITable>(slide->get_Shape(0));
Console::WriteLine(u"Lock aspect ratio set: {0}", table->get_GraphicalObjectLock()->get_AspectRatioLocked());
table->get_GraphicalObjectLock()->set_AspectRatioLocked(true);
Console::WriteLine(u"Lock aspect ratio set: {0}", table->get_GraphicalObjectLock()->get_AspectRatioLocked());
presentation->Save(u"pres-out.pptx", SaveFormat::Pptx);
FAQ
Можно ли включить режим чтения справа налево (RTL) для всей таблицы и текста в её ячейках?
Да. Таблица предоставляет метод set_RightToLeft, а абзацы имеют ParagraphFormat::set_RightToLeft. Использование обоих обеспечивает правильный порядок RTL и корректное отображение внутри ячеек.
Как предотвратить перемещение или изменение размеров таблицы в итоговом файле?
Используйте shape locks для отключения перемещения, изменения размеров, выделения и т.д. Эти блокировки применимы и к таблицам.
Поддерживается ли вставка изображения в ячейку в качестве фона?
Да. Вы можете задать picture fill для ячейки; изображение закроет область ячейки в соответствии с выбранным режимом (растягивание или плитка).