Zarządzanie komórkami tabel w prezentacjach przy użyciu Java
Przegląd
Aspose.Slides umożliwia dostęp i modyfikację komórek tabel w prezentacjach PowerPoint. Ten artykuł wyjaśnia, jak zidentyfikować połączone komórki tabel, usunąć obramowania komórek, pracować z numeracją komórek po scaleniu lub podzieleniu komórek, zmienić kolor tła komórki oraz dodać obraz wewnątrz komórki tabeli. Przykłady pokazują, jak utworzyć lub otworzyć prezentację, pobrać tabelę ze slajdu, zaktualizować formatowanie komórek za pomocą właściwości komórek oraz zapisać zmodyfikowaną prezentację jako plik PPTX.
Aspose.Slides używa indeksów zaczynających się od zera do dostępu do komórek tabel w kolejności (column, row).
Identyfikacja połączonej komórki tabeli
Przykład otwiera istniejącą prezentację i uzyskuje dostęp do pierwszego kształtu na pierwszym slajdzie jako tabeli. Zakłada, że slajd i kształt istnieją oraz że kształt jest tabelą. Następnie iteruje przez wszystkie wiersze i kolumny i używa isMergedCell do identyfikacji komórek w połączonych obszarach. Dla każdego dopasowania wypisuje współrzędne komórki w kolejności row;column, getRowSpan, getColSpan oraz początkowe współrzędne regionu, getFirstRowIndex i getFirstColumnIndex.
import com.aspose.slides.*;
Presentation presentation = new Presentation("presentation_with_table.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
ITable table = (ITable) slide.getShapes().get_Item(0);
int rowCount = table.getRows().size();
for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
{
int columnCount = table.getColumns().size();
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++)
{
ICell cell = table.get_Item(columnIndex, rowIndex);
if (cell.isMergedCell())
{
System.out.printf("Cell %d;%d belongs to a merged region with RowSpan=%d and ColSpan=%d starting at %d;%d.%n", rowIndex, columnIndex, cell.getRowSpan(), cell.getColSpan(), cell.getFirstRowIndex(), cell.getFirstColumnIndex());
}
}
}
} finally {
presentation.dispose();
}
Usuwanie obramowań komórek tabeli
Utwórz Presentation i dodaj tabelę do pierwszego slajdu za pomocą addTable. Szerokości kolumn, wysokości wierszy i pozycja tabeli są określone w punktach. Przykład ustawia wszystkie cztery obramowania komórek na FillType.NoFill, czyniąc je niewidocznymi.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
double[] columnWidths = { 50, 50, 50, 50 };
double[] rowHeights = { 50, 30, 30, 30, 30 };
ITable table = slide.getShapes().addTable(100, 50, columnWidths, rowHeights);
for (IRow row : table.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);
}
presentation.save("table.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Scalanie komórek tabeli
Użyj mergeCells , aby połączyć prostokątny zakres komórek tabeli w jedną komórkę. Określ komórki w lewym górnym i prawym dolnym rogu zakresu. Ostatni argument kontroluje, czy scalanie może obejmować komórki poza określonym zakresem; false utrzymuje scalanie w ramach tego zakresu.
Przykład tworzy tabelę 4‑na‑4 z kolumnami i wierszami o szerokości 70 punktów, a następnie scala cztery środkowe komórki od (1, 1) do (2, 2). Powstała komórka zajmuje dwie kolumny i dwa wiersze, podczas gdy podstawowa siatka tabeli zachowuje cztery kolumny i cztery wiersze. Aby uzyskać dostęp do zawartości lub formatowania połączonej komórki, użyj jej lewego górnego położenia: table.get_Item(1, 1) w tym przykładzie. Pozostałe pozycje w połączonym zakresie pozostają częścią siatki tabeli, więc indeksy komórek poza zakresem nie ulegają zmianie.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
double[] columnWidths = { 70, 70, 70, 70 };
double[] rowHeights = { 70, 70, 70, 70 };
ITable table = slide.getShapes().addTable(100, 50, columnWidths, rowHeights);
table.mergeCells(table.get_Item(1, 1), table.get_Item(2, 2), false);
presentation.save("merged_cells.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Rozdzielanie komórek tabeli
Scalanie komórek w poprzednim przykładzie zachowuje siatkę tabeli. Rozdzielenie komórki może wprowadzić nową kolumnę siatki i zmienić indeksy kolumn komórek po jej prawej stronie. Aspose.Slides stosuje się do modelu siatki tabel PowerPointa.
Ten przykład tworzy tabelę 4‑na‑4 z kolumnami i wierszami o szerokości 70 punktów i wywołuje splitByWidth na komórce (1, 1). Połowa szerokości 70‑punktowej komórki jest przekazywana w celu utworzenia dwóch komórek o równej szerokości.
Po tym podziale obie połowy są dostępne jako table.get_Item(1, 1) i table.get_Item(2, 1). Siatka tabeli ma teraz pięć kolumn: komórki pierwotnie w kolumnach 2 i 3 przenoszone są odpowiednio do kolumn 3 i 4. Indeksy wierszy pozostają niezmienione. Użyj tych zaktualizowanych indeksów kolumn przy dostępie do komórek po podziale.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
double[] columnWidths = { 70, 70, 70, 70 };
double[] rowHeights = { 70, 70, 70, 70 };
ITable table = slide.getShapes().addTable(100, 50, columnWidths, rowHeights);
table.get_Item(1, 1).splitByWidth(table.get_Item(1, 1).getWidth() / 2);
presentation.save("split_cells.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Rozdzielanie połączonych komórek według zakresu wiersza lub kolumny
Aby przygotować połączone komórki szablonu do wypełnienia danymi, użyj splitByRowSpan do podziału wzdłuż istniejącej granicy wiersza lub splitByColSpan do podziału wzdłuż granicy kolumny.
Argument index liczy wiersze w górnej części lub kolumny w lewej części podziału; jest względny względem połączonego regionu:
- Podział wiersza:
0 < index <getRowSpan. - Podział kolumny:
0 < index <getColSpan.
Przykład zakłada, że prezentacja ma tabelę jako pierwszy kształt na pierwszym slajdzie, przy czym (1, 2) i (1, 3) są połączone pionowo. Zaczynając od niższej pozycji, używa getFirstColumnIndex i getFirstRowIndex do określenia punktu początkowego i sprawdza oba zakresy. splitByRowSpan(1) oddziela następnie wiersze 2 i 3 dla nazw produktów. W przypadku poziomego połączenia dwóch kolumn użyj splitByColSpan(1) zamiast tego.
import com.aspose.slides.*;
Presentation presentation = new Presentation("table_template.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
ITable table = (ITable) slide.getShapes().get_Item(0);
ICell selectedCell = table.get_Item(1, 3);
int firstColumnIndex = selectedCell.getFirstColumnIndex();
int firstRowIndex = selectedCell.getFirstRowIndex();
ICell mergedCell = table.get_Item(firstColumnIndex, firstRowIndex);
if (mergedCell.isMergedCell() && mergedCell.getRowSpan() == 2 && mergedCell.getColSpan() == 1)
{
mergedCell.splitByRowSpan(1);
// Pobierz powstałe komórki z tabeli po podziale.
ICell upperCell = table.get_Item(firstColumnIndex, firstRowIndex);
ICell lowerCell = table.get_Item(firstColumnIndex, firstRowIndex + 1);
System.out.println("Upper cell merged: " + upperCell.isMergedCell());
System.out.println("Lower cell merged: " + lowerCell.isMergedCell());
upperCell.getTextFrame().setText("Product A");
lowerCell.getTextFrame().setText("Product B");
presentation.save("split_template.pptx", SaveFormat.Pptx);
}
else
{
System.out.println("Select a merged region spanning exactly two rows and one column.");
}
} finally {
presentation.dispose();
}
Siatka tabeli oraz otaczające indeksy komórek pozostają niezmienione. Pobierz powstałe komórki według ich współrzędnych; tutaj obie mają zakres 1, a isMergedCell zwraca false. Większe obszary mogą pozostać częściowo połączone po jednym podziale.
Oryginalny tekst i jego formatowanie pozostają w górnej (lub lewej) komórce; nowa komórka jest pusta, ale odziedzicza formatowanie komórki, takie jak wypełnienie, obramowania i marginesy. Wypełnij komórki po podziale i ustaw wszelkie wymagane formatowanie tekstu explicite.
Zapisana prezentacja zawiera osobne komórki „Product A” i „Product B” z zachowanym formatowaniem komórek szablonu. Zobacz Cell API Reference po więcej szczegółów.
Zmienianie koloru tła komórki tabeli
Ten przykład tworzy tabelę z kolumnami o szerokości 150 punktów i wierszami o wysokości 50 punktów. Używa setFillType do wybrania jednolitego wypełnienia i ustawia kolor zwracany przez getSolidFillColor na czerwony dla komórki (2, 3), w trzeciej kolumnie i czwartym wierszu.
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
double[] columnWidths = { 150, 150, 150, 150 };
double[] rowHeights = { 50, 50, 50, 50, 50 };
ITable table = slide.getShapes().addTable(50, 50, columnWidths, rowHeights);
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 {
presentation.dispose();
}
Dodawanie obrazu wewnątrz komórki tabeli
Umieść wejściowy obraz w katalogu roboczym przed uruchomieniem tego przykładu. Ładuje obraz za pomocą Images.fromFile i dodaje go do kolekcji obrazów prezentacji przy użyciu addImage. Następnie przypisuje obraz do wypełnienia graficznego komórki (0, 0), pierwszej komórki w tabeli.
PictureFillMode.Stretch rozciąga obraz, aby wypełnić komórkę, co może zmienić jej proporcje. Szerokości kolumn i wysokości wierszy podawane są w punktach. Załadowany obraz jest zwalniany w bloku finally po jego dodaniu do prezentacji.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
double[] columnWidths = { 150, 150, 150, 150 };
double[] rowHeights = { 100, 100, 100, 100, 90 };
ITable table = slide.getShapes().addTable(50, 50, columnWidths, rowHeights);
IPPImage ppImage;
IImage image = Images.fromFile("aspose_logo.jpg");
try {
ppImage = presentation.getImages().addImage(image);
} finally {
image.dispose();
}
table.get_Item(0, 0).getCellFormat().getFillFormat().setFillType(FillType.Picture);
table.get_Item(0, 0).getCellFormat().getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch);
table.get_Item(0, 0).getCellFormat().getFillFormat().getPictureFillFormat().getPicture().setImage(ppImage);
presentation.save("table_cell_with_image.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
FAQ
Czy mogę ustawić różne grubości linii i style dla różnych stron jednej komórki?
Tak. Obramowania top/bottom/left/right mają oddzielne właściwości, więc grubość i styl każdej strony mogą się różnić.
Co się stanie z obrazem, jeśli zmienię rozmiar kolumny/wiersza po ustawieniu obrazu jako tła komórki?
Zachowanie zależy od fill mode (stretch/tile). Przy rozciąganiu obraz dostosowuje się do nowej komórki; przy kafelkowaniu kafelki są przeliczane.
Czy mogę przypisać hiperłącze do całej zawartości komórki?
Hyperlinks są ustawiane na poziomie tekstu (fragmentu) wewnątrz ramki tekstowej komórki lub na poziomie całej tabeli/kształtu. W praktyce przypisujesz link do fragmentu lub do całego tekstu w komórce.
Czy mogę ustawić różne czcionki w jednej komórce?
Tak. Ramka tekstowa komórki obsługuje portions (fragmenty) z niezależnym formatowaniem — rodzina czcionki, styl, rozmiar i kolor.