Управление ячейками таблиц в презентациях на .NET
Определить объединённую ячейку таблицы
- Создайте экземпляр класса Presentation .
- Получите таблицу с первого слайда.
- Итерируйте строки и столбцы таблицы, чтобы найти объединённые ячейки.
- Выведите сообщение, когда найдены объединённые ячейки.
Этот код на C# показывает, как определить объединённые ячейки таблицы в презентации:
using (Presentation pres = new Presentation("SomePresentationWithTable.pptx"))
{
ITable table = pres.Slides[0].Shapes[0] as ITable; // предполагая, что Slide#0.Shape#0 является таблицей
for (int i = 0; i < table.Rows.Count; i++)
{
for (int j = 0; j < table.Columns.Count; j++)
{
ICell currentCell = table.Rows[i][j];
if (currentCell.IsMergedCell)
{
Console.WriteLine(string.Format("Cell {0};{1} is a part of merged cell with RowSpan={2} and ColSpan={3} starting from Cell {4};{5}.",
i, j, currentCell.RowSpan, currentCell.ColSpan, currentCell.FirstRowIndex, currentCell.FirstColumnIndex));
}
}
}
}
Удалить границы ячеек таблицы
- Создайте экземпляр класса
Presentation. - Получите ссылку на слайд по его индексу.
- Определите массив столбцов с шириной.
- Определите массив строк с высотой.
- Добавьте таблицу на слайд с помощью метода
AddTable. - Итерируйте каждую ячейку, чтобы очистить верхнюю, нижнюю, правую и левую границы.
- Сохраните изменённую презентацию в файл PPTX.
Этот код на C# показывает, как удалить границы из ячеек таблицы:
// Создаёт экземпляр класса Presentation, представляющего файл PPTX
using (Presentation pres = new Presentation())
{
// Получает первый слайд
Slide sld = (Slide)pres.Slides[0];
// Определяет столбцы с ширинами и строки с высотами
double[] dblCols = { 50, 50, 50, 50 };
double[] dblRows = { 50, 30, 30, 30, 30 };
// Добавляет форму таблицы на слайд
ITable tbl = sld.Shapes.AddTable(100, 50, dblCols, dblRows);
// Устанавливает формат границы для каждой ячейки
foreach (IRow row in tbl.Rows)
foreach (ICell cell in row)
{
cell.CellFormat.BorderTop.FillFormat.FillType = FillType.NoFill;
cell.CellFormat.BorderBottom.FillFormat.FillType = FillType.NoFill;
cell.CellFormat.BorderLeft.FillFormat.FillType = FillType.NoFill;
cell.CellFormat.BorderRight.FillFormat.FillType = FillType.NoFill;
}
// Записывает файл PPTX на диск
pres.Save("table_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
}
Нумерация в объединённых ячейках
Если объединить 2 пары ячеек (1, 1) x (2, 1) и (1, 2) x (2, 2), получившаяся таблица будет пронумерована. Этот код на C# демонстрирует процесс:
// Создаёт экземпляр класса Presentation, представляющего файл PPTX
using (Presentation presentation = new Presentation())
{
// Получает первый слайд
ISlide sld = presentation.Slides[0];
// Определяет столбцы с ширинами и строки с высотами
double[] dblCols = { 70, 70, 70, 70 };
double[] dblRows = { 70, 70, 70, 70 };
// Добавляет форму таблицы на слайд
ITable tbl = sld.Shapes.AddTable(100, 50, dblCols, dblRows);
// Устанавливает формат границы для каждой ячейки
foreach (IRow row in tbl.Rows)
{
foreach (ICell cell in row)
{
cell.CellFormat.BorderTop.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderTop.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderTop.Width = 5;
cell.CellFormat.BorderBottom.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderBottom.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderBottom.Width = 5;
cell.CellFormat.BorderLeft.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderLeft.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderLeft.Width = 5;
cell.CellFormat.BorderRight.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderRight.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderRight.Width = 5;
}
}
// Объединяет ячейки (1, 1) x (2, 1)
tbl.MergeCells(tbl[1, 1], tbl[2, 1], false);
// Объединяет ячейки (1, 2) x (2, 2)
tbl.MergeCells(tbl[1, 2], tbl[2, 2], false);
presentation.Save("MergeCells_out.pptx", SaveFormat.Pptx);
}
Затем мы продолжим объединять ячейки, объединив (1, 1) и (1, 2). В результате получим таблицу с большой объединённой ячейкой в центре:
// Создаёт экземпляр класса Presentation, представляющего файл PPTX
using (Presentation presentation = new Presentation())
{
// Получает первый слайд
ISlide slide = presentation.Slides[0];
// Определяет столбцы с ширинами и строки с высотами
double[] dblCols = { 70, 70, 70, 70 };
double[] dblRows = { 70, 70, 70, 70 };
// Добавляет форму таблицы на слайд
ITable table = slide.Shapes.AddTable(100, 50, dblCols, dblRows);
// Устанавливает формат границы для каждой ячейки
foreach (IRow row in table.Rows)
{
foreach (ICell cell in row)
{
cell.CellFormat.BorderTop.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderTop.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderTop.Width = 5;
cell.CellFormat.BorderBottom.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderBottom.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderBottom.Width = 5;
cell.CellFormat.BorderLeft.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderLeft.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderLeft.Width = 5;
cell.CellFormat.BorderRight.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderRight.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderRight.Width = 5;
}
}
// Объединяет ячейки (1, 1) x (2, 1)
table.MergeCells(table[1, 1], table[2, 1], false);
// Объединяет ячейки (1, 2) x (2, 2)
table.MergeCells(table[1, 2], table[2, 2], false);
// Объединяет ячейки (1, 2) x (2, 2)
table.MergeCells(table[1, 1], table[1, 2], true);
// Записывает файл PPTX на диск
presentation.Save("MergeCells1_out.pptx", SaveFormat.Pptx);
}
Нумерация в разделённой ячейке
В предыдущих примерах, когда ячейки таблицы объединялись, нумерация или система номеров в остальных ячейках не изменялась.
В этот раз мы берём обычную таблицу (без объединённых ячеек) и пытаемся разделить ячейку (1,1), получая особую таблицу. Обратите внимание на нумерацию этой таблицы, которая может показаться странной. Однако именно так Microsoft PowerPoint нумерует ячейки таблицы, и Aspose.Slides делает то же самое.
Этот код на C# демонстрирует описанный процесс:
// Создаёт экземпляр класса Presentation, представляющего файл PPTX
using (Presentation presentation = new Presentation())
{
// Получает первый слайд
ISlide slide = presentation.Slides[0];
// Определяет столбцы с ширинами и строки с высотами
double[] dblCols = { 70, 70, 70, 70 };
double[] dblRows = { 70, 70, 70, 70 };
// Добавляет форму таблицы на слайд
ITable table = slide.Shapes.AddTable(100, 50, dblCols, dblRows);
// Устанавливает формат границы для каждой ячейки
foreach (IRow row in table.Rows)
{
foreach (ICell cell in row)
{
cell.CellFormat.BorderTop.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderTop.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderTop.Width = 5;
cell.CellFormat.BorderBottom.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderBottom.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderBottom.Width = 5;
cell.CellFormat.BorderLeft.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderLeft.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderLeft.Width = 5;
cell.CellFormat.BorderRight.FillFormat.FillType = FillType.Solid;
cell.CellFormat.BorderRight.FillFormat.SolidFillColor.Color = Color.Red;
cell.CellFormat.BorderRight.Width = 5;
}
}
// Объединяет ячейки (1, 1) x (2, 1)
table.MergeCells(table[1, 1], table[2, 1], false);
// Объединяет ячейки (1, 2) x (2, 2)
table.MergeCells(table[1, 2], table[2, 2], false);
// Делит ячейку (1, 1).
table[1, 1].SplitByWidth(table[2, 1].Width / 2);
// Записывает файл PPTX на диск
presentation.Save("CellSplit_out.pptx", SaveFormat.Pptx);
}
Изменить цвет фона ячейки таблицы
Этот код на C# показывает, как изменить цвет фона ячейки таблицы:
using (Presentation presentation = new Presentation())
{
ISlide slide = presentation.Slides[0];
double[] dblCols = { 150, 150, 150, 150 };
double[] dblRows = { 50, 50, 50, 50, 50 };
// создать новую таблицу
ITable table = slide.Shapes.AddTable(50, 50, dblCols, dblRows);
// установить цвет фона ячейки
ICell cell = table[2, 3];
cell.CellFormat.FillFormat.FillType = FillType.Solid;
cell.CellFormat.FillFormat.SolidFillColor.Color = Color.Red;
presentation.Save("cell_background_color.pptx", SaveFormat.Pptx);
}
Добавить изображение внутри ячейки таблицы
- Создайте экземпляр класса
Presentation. - Получите ссылку на слайд по его индексу.
- Определите массив столбцов с шириной.
- Определите массив строк с высотой.
- Добавьте таблицу на слайд с помощью метода
AddTable. - Создайте объект
Bitmapдля хранения файла изображения. - Добавьте bitmap‑изображение в объект
IPPImage. - Установите
FillFormatдля ячейки таблицы в значениеPicture. - Добавьте изображение в первую ячейку таблицы.
- Сохраните изменённую презентацию в файл PPTX.
Этот код на C# показывает, как разместить изображение внутри ячейки таблицы при её создании:
// Создаёт экземпляр класса Presentation, представляющего файл PPTX
using (Presentation presentation = new Presentation())
{
// Получает первый слайд
ISlide slide = presentation.Slides[0];
// Определяет столбцы с ширинами и строки с высотами
double[] dblCols = { 150, 150, 150, 150 };
double[] dblRows = { 100, 100, 100, 100, 90 };
// Добавляет форму таблицы на слайд
ITable table = slide.Shapes.AddTable(50, 50, dblCols, dblRows);
// Загружает изображение из файла и добавляет его в ресурсы презентации
IImage image = Images.FromFile("aspose-logo.jpg");
IPPImage ppImage = presentation.Images.AddImage(image);
image.Dispose();
// Добавляет изображение в первую ячейку таблицы
table[0, 0].CellFormat.FillFormat.FillType = FillType.Picture;
table[0, 0].CellFormat.FillFormat.PictureFillFormat.PictureFillMode = PictureFillMode.Stretch;
table[0, 0].CellFormat.FillFormat.PictureFillFormat.Picture.Image = ppImage;
// Сохраняет файл PPTX на диск
presentation.Save("Image_In_TableCell_out.pptx", SaveFormat.Pptx);
}
FAQ
Могу ли я задать разную толщину и стили линий для разных сторон одной ячейки?
Да. Границы верхняя/нижняя/левая/правая имеют отдельные свойства, поэтому толщина и стиль каждой стороны могут отличаться. Это логично вытекает из управления границами каждой стороны ячейки, продемонстрированного в статье.
Что происходит с изображением, если я изменю размер столбца/строки после установки картинки как фон ячейки?
Поведение зависит от режима заливки (растягивание/мозаика). При растягивании изображение подстраивается под новую ячейку; при мозаичном режиме плитки пересчитываются. В статье упоминаются режимы отображения изображения в ячейке.
Могу ли я назначить гиперссылку всему содержимому ячейки?
Hyperlinks задаются на уровне текста (части) внутри текстового фрейма ячейки или на уровне всей таблицы/формы. На практике вы назначаете ссылку части текста или всему тексту в ячейке.
Могу ли я задать разные шрифты внутри одной ячейки?
Да. Текстовый фрейм ячейки поддерживает части (runs) с независимым форматированием — семейство шрифтов, стиль, размер и цвет.