Управление ячейками таблиц в презентациях с использованием Java
Определить объединённую ячейку таблицы
- Создайте экземпляр класса Presentation.
- Получите таблицу с первого слайда.
- Пройдитесь по строкам и столбцам таблицы, чтобы найти объединённые ячейки.
- Выведите сообщение, когда обнаружены объединённые ячейки.
Этот код на Java показывает, как определить объединённые ячейки таблицы в презентации:
Presentation pres = new Presentation("SomePresentationWithTable.pptx");
try {
ITable table = (ITable)pres.getSlides().get_Item(0).getShapes().get_Item(0); // предполагая, что Slide#0.Shape#0 является таблицей
for (int i = 0; i < table.getRows().size(); i++)
{
for (int j = 0; j < table.getColumns().size(); j++)
{
ICell currentCell = table.getRows().get_Item(i).get_Item(j);
if (currentCell.isMergedCell())
{
System.out.println(String.format("Cell %d;%d is a part of merged cell with RowSpan=%d and ColSpan=%d starting from Cell %d;%d.",
i, j, currentCell.getRowSpan(), currentCell.getColSpan(), currentCell.getFirstRowIndex(), currentCell.getFirstColumnIndex()));
}
}
}
} finally {
if (pres != null) pres.dispose();
}
Удалить границы ячеек таблицы
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Определите массив столбцов с шириной.
- Определите массив строк с высотой.
- Добавьте таблицу на слайд с помощью метода addTable.
- Пройдитесь по всем ячейкам, чтобы очистить верхнюю, нижнюю, правую и левую границы.
- Сохраните изменённую презентацию в файле PPTX.
Этот код на Java показывает, как удалить границы из ячеек таблицы:
// Создает экземпляр класса Presentation, представляющего файл PPTX
Presentation pres = new Presentation();
try {
// Получает первый слайд
Slide sld = (Slide)pres.getSlides().get_Item(0);
// Определяет столбцы с ширинами и строки с высотами
double[] dblCols = { 50, 50, 50, 50 };
double[] dblRows = { 50, 30, 30, 30, 30 };
// Добавляет форму таблицы на слайд
ITable tbl = sld.getShapes().addTable(100, 50, dblCols, dblRows);
// Устанавливает формат границы для каждой ячейки
for (IRow row : tbl.getRows())
{
for (ICell cell : 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 на диск
pres.save("table_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Нумерация в объединённых ячейках
Если мы объединим 2 пары ячеек (1, 1) × (2, 1) и (1, 2) × (2, 2), получившаяся таблица будет пронумерована. Этот код на Java демонстрирует процесс:
// Создает экземпляр класса Presentation, представляющего файл PPTX
Presentation pres = new Presentation();
try {
// Получает первый слайд
ISlide sld = pres.getSlides().get_Item(0);
// Определяет столбцы с ширинами и строки с высотами
double[] dblCols = { 70, 70, 70, 70 };
double[] dblRows = { 70, 70, 70, 70 };
// Добавляет форму таблицы на слайд
ITable tbl = sld.getShapes().addTable(100, 50, dblCols, dblRows);
// Устанавливает формат границы для каждой ячейки
for (IRow row : tbl.getRows())
{
for (ICell cell : 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) x (2, 1)
tbl.mergeCells(tbl.get_Item(1, 1), tbl.get_Item(2, 1), false);
// Объединяет ячейки (1, 2) x (2, 2)
tbl.mergeCells(tbl.get_Item(1, 2), tbl.get_Item(2, 2), false);
pres.save("MergeCells_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Затем мы продолжаем объединять ячейки, объединив (1, 1) и (1, 2). В результате получается таблица с большой объединённой ячейкой в центре:
// Создаёт экземпляр класса Presentation, представляющего файл PPTX
Presentation pres = new Presentation();
try {
// Получает первый слайд
ISlide sld = pres.getSlides().get_Item(0);
// Определяет столбцы с ширинами и строки с высотами
double[] dblCols = { 70, 70, 70, 70 };
double[] dblRows = { 70, 70, 70, 70 };
// Добавляет форму таблицы на слайд
ITable tbl = sld.getShapes().addTable(100, 50, dblCols, dblRows);
// Устанавливает формат границы для каждой ячейки
for (IRow row : tbl.getRows())
{
for (ICell cell : 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) x (2, 1)
tbl.mergeCells(tbl.get_Item(1, 1), tbl.get_Item(2, 1), false);
// Объединяет ячейки (1, 2) x (2, 2)
tbl.mergeCells(tbl.get_Item(1, 2), tbl.get_Item(2, 2), false);
// Объединяет ячейки (1, 1) x (1, 2)
tbl.mergeCells(tbl.get_Item(1, 1), tbl.get_Item(1, 2), true);
// Записывает файл PPTX на диск
pres.save("MergeCells_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Нумерация в разбитой ячейке
В предыдущих примерах, когда ячейки таблицы объединялись, нумерация или система чисел в остальных ячейках не менялась.
На этот раз мы берём обычную таблицу (таблицу без объединённых ячеек) и пытаемся разделить ячейку (1,1), получив особую таблицу. Обратите внимание на нумерацию этой таблицы, которая может показаться странной. Однако именно так Microsoft PowerPoint нумерует ячейки таблицы, и Aspose.Slides делает то же самое.
Этот код на Java демонстрирует описанный процесс:
// Создает экземпляр класса Presentation, представляющего файл PPTX
Presentation pres = new Presentation();
try {
// Получает первый слайд
ISlide sld = pres.getSlides().get_Item(0);
// Определяет столбцы с ширинами и строки с высотами
double[] dblCols = { 70, 70, 70, 70 };
double[] dblRows = { 70, 70, 70, 70 };
// Добавляет форму таблицы на слайд
ITable tbl = sld.getShapes().addTable(100, 50, dblCols, dblRows);
// Задает формат границы для каждой ячейки
for (IRow row : tbl.getRows())
{
for (ICell cell : 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) x (2, 1)
tbl.mergeCells(tbl.get_Item(1, 1), tbl.get_Item(2, 1), false);
// Объединяет ячейки (1, 2) x (2, 2)
tbl.mergeCells(tbl.get_Item(1, 2), tbl.get_Item(2, 2), false);
// Разделяет ячейку (1, 1)
tbl.get_Item(1, 1).splitByWidth(tbl.get_Item(2, 1).getWidth() / 2);
//Записывает файл PPTX на диск
pres.save("SplitCells_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Изменить цвет фона ячейки таблицы
Этот код на Java показывает, как изменить цвет фона ячейки таблицы:
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
double[] dblCols = { 150, 150, 150, 150 };
double[] dblRows = { 50, 50, 50, 50, 50 };
// создать новую таблицу
ITable table = slide.getShapes().addTable(50, 50, dblCols, dblRows);
// установить цвет фона для ячейки
ICell cell = table.get_Item(2, 3);
cell.getCellFormat().getFillFormat().setFillType(FillType.Solid);
cell.getCellFormat().getFillFormat().getSolidFillColor().setColor(Color.RED);
presentation.save("cell_background_color.pptx", SaveFormat.Pptx);
} finally {
if (presentation != null) presentation.dispose();
}
Добавить изображение внутрь ячейки таблицы
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Определите массив столбцов с шириной.
- Определите массив строк с высотой.
- Добавьте таблицу на слайд с помощью метода AddTable.
- Создайте объект
Imagesдля хранения файла изображения. - Добавьте изображение
IImageв объектIPPImage. - Установите
FillFormatдля ячейки таблицы в значениеPicture. - Добавьте изображение в первую ячейку таблицы.
- Сохраните изменённую презентацию в файле PPTX
Этот код на Java показывает, как разместить изображение внутри ячейки таблицы при её создании:
// Создает экземпляр класса Presentation, представляющего файл PPTX
Presentation pres = new Presentation();
try {
// Получает первый слайд
ISlide islide = pres.getSlides().get_Item(0);
// Определяет столбцы с ширинами и строки с высотами
double[] dblCols = {150, 150, 150, 150};
double[] dblRows = {100, 100, 100, 100, 90};
// Добавляет форму таблицы на слайд
ITable tbl = islide.getShapes().addTable(50, 50, dblCols, dblRows);
// Создает объект IPPImage, используя файл изображения
IPPImage picture;
IImage image = Images.fromFile("image.jpg");
try {
picture = pres.getImages().addImage(image);
} finally {
if (image != null) image.dispose();
}
// Добавляет изображение в первую ячейку таблицы
ICellFormat cellFormat = tbl.get_Item(0, 0).getCellFormat();
cellFormat.getFillFormat().setFillType(FillType.Picture);
cellFormat.getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch);
cellFormat.getFillFormat().getPictureFillFormat().getPicture().setImage(picture);
// Сохраняет файл PPTX на диск
pres.save("Image_In_TableCell_out.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
if (pres != null) pres.dispose();
}
FAQ
Можно ли задать разную толщину линий и стили для разных сторон одной ячейки?
Да. Границы верхняя/нижняя/левая/правая имеют отдельные свойства, поэтому толщина и стиль каждой стороны могут различаться. Это логично вытекает из управления границами по сторонам для ячейки, продемонстрированного в статье.
Что происходит с изображением, если я изменяю размер столбца/строки после установки изображения как фона ячейки?
Поведение зависит от режима заливки (растягивание/мозаика). При растягивании изображение подгоняется под новую ячейку; при мозаике плитки пересчитываются. В статье упоминаются режимы отображения изображения в ячейке.
Можно ли назначить гиперссылку всему содержимому ячейки?
Hyperlinks устанавливаются на уровне текста (части) внутри текстового фрейма ячейки или на уровне всей таблицы/фигуры. На практике вы назначаете ссылку части или всему тексту в ячейке.
Можно ли задать разные шрифты внутри одной ячейки?
Да. Текстовый фрейм ячейки поддерживает части (runs) с независимым форматированием — семью шрифтов, стиль, размер и цвет.