Zarządzanie tabelami prezentacji w C++
Wprowadzenie
Tabela w programie PowerPoint to efektywny sposób wyświetlania i przedstawiania informacji. Informacje w siatce komórek (ustawionych w wierszach i kolumnach) są przejrzyste i łatwe do zrozumienia.
Aspose.Slides udostępnia klasę Table, interfejs ITable, klasę Cell, interfejs ICell oraz inne typy, które umożliwiają tworzenie, aktualizowanie i zarządzanie tabelami we wszystkich rodzajach prezentacji.
Utworzenie tabeli od podstaw
- Utwórz instancję klasy Presentation.
- Uzyskaj odniesienie do slajdu za pomocą jego indeksu.
- Zdefiniuj tablicę
columnWidth. - Zdefiniuj tablicę
rowHeight. - Dodaj obiekt ITable do slajdu przy użyciu metody AddTable().
- Iteruj po każdym ICell, aby zastosować formatowanie do górnej, dolnej, prawej i lewej krawędzi.
- Scal pierwsze dwie komórki pierwszego wiersza tabeli.
- Uzyskaj dostęp do TextFrame obiektu ICell.
- Dodaj tekst do TextFrame.
- Zapisz zmodyfikowaną prezentację.
Ten kod C++ pokazuje, jak utworzyć tabelę w prezentacji:
#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/ISlideCollection.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;
// Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
auto pres = System::MakeObject<Presentation>();
// Uzyskuje dostęp do pierwszego slajdu
auto sld = pres->get_Slides()->idx_get(0);
// Definiuje kolumny z szerokościami i wiersze z wysokościami
auto dblCols = System::MakeArray<double>({ 50, 50, 50 });
auto dblRows = System::MakeArray<double>({ 50, 30, 30, 30, 30 });
// Dodaje kształt tabeli do slajdu
auto tbl = sld->get_Shapes()->AddTable(100.0f, 50.0f, dblCols, dblRows);
// Ustawia formatowanie krawędzi dla każdej komórki
for (int32_t row = 0; row < tbl->get_Rows()->get_Count(); row++)
{
for (int32_t cell = 0; cell < tbl->get_Rows()->idx_get(row)->get_Count(); cell++)
{
auto cellFormat = tbl->get_Rows()->idx_get(row)->idx_get(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);
}
}
// Łączy komórki 1 i 2 pierwszego wiersza
tbl->MergeCells(tbl->get_Rows()->idx_get(0)->idx_get(0), tbl->get_Rows()->idx_get(1)->idx_get(1), false);
// Dodaje trochę tekstu do połączonej komórki
tbl->get_Rows()->idx_get(0)->idx_get(0)->get_TextFrame()->set_Text(u"Merged Cells");
// Zapisuje prezentację na dysku
pres->Save(u"table.pptx", SaveFormat::Pptx);
Numeracja w standardowej tabeli
W standardowej tabeli numeracja komórek jest prosta i zaczyna się od zera. Pierwsza komórka w tabeli ma indeks 0,0 (kolumna 0, wiersz 0).
Na przykład komórki w tabeli z 4 kolumnami i 4 wierszami są numerowane w ten sposób:
| (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) |
Ten kod C++ pokazuje, jak określić numerację komórek w tabeli:
#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/ISlideCollection.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;
// Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
auto pres = System::MakeObject<Presentation>();
// Uzyskuje dostęp do pierwszego slajdu
auto sld = pres->get_Slides()->idx_get(0);
// Definiuje kolumny o szerokościach i wiersze o wysokościach
auto dblCols = System::MakeArray<double>({ 70, 70, 70, 70 });
auto dblRows = System::MakeArray<double>({ 70, 70, 70, 70 });
// Dodaje kształt tabeli do slajdu
auto tbl = sld->get_Shapes()->AddTable(100.0f, 50.0f, dblCols, dblRows);
// Ustawia formatowanie krawędzi dla każdej komórki
for (const auto& row : tbl->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);
}
}
// Zapisuje prezentację na dysk
pres->Save(u"StandardTables_out.pptx", SaveFormat::Pptx);
Dostęp do istniejącej tabeli
-
Utwórz instancję klasy Presentation.
-
Uzyskaj odniesienie do slajdu zawierającego tabelę za pomocą jego indeksu.
-
Utwórz obiekt ITable i ustaw go na null.
-
Iteruj po wszystkich obiektach IShape, aż znajdziesz tabelę.
Jeśli podejrzewasz, że omawiany slajd zawiera jedną tabelę, możesz po prostu sprawdzić wszystkie znajdujące się na nim kształty. Gdy kształt zostanie zidentyfikowany jako tabela, możesz rzutować go na obiekt Table. Jednak jeśli slajd zawiera kilka tabel, lepiej jest wyszukać potrzebną tabelę za pomocą jej metody set_AlternativeText().
-
Użyj obiektu ITable, aby pracować z tabelą. W poniższym przykładzie dodaliśmy nowy wiersz do tabeli.
-
Zapisz zmodyfikowaną prezentację.
Ten kod C++ pokazuje, jak uzyskać dostęp i pracować z istniejącą tabelą:
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.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>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
// Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
auto pres = System::MakeObject<Presentation>(u"UpdateExistingTable.pptx");
// Uzyskuje dostęp do pierwszego slajdu
auto sld = pres->get_Slides()->idx_get(0);
// Inicjalizuje pustą tabelę
System::SharedPtr<ITable> tbl;
// Iteruje po kształtach i ustawia odniesienie do znalezionej tabeli
for (const auto& shp : System::IterateOver(sld->get_Shapes()))
{
if (System::ObjectExt::Is<ITable>(shp))
{
tbl = System::ExplicitCast<ITable>(shp);
}
}
// Ustawia tekst dla pierwszej kolumny drugiego wiersza
tbl->idx_get(0, 1)->get_TextFrame()->set_Text(u"New");
// Zapisuje zmodyfikowaną prezentację na dysk
pres->Save(u"table1_out.pptx", SaveFormat::Pptx);
Znajdź komórkę będącą właścicielem ramki tekstowej
Kiedy ogólny kod przetwarzający tekst otrzymuje obiekt ITextFrame z tabeli, użyj ITextFrame::get_ParentCell, aby odzyskać należący ICell. Dla ramki tekstowej w komórce tabeli, ITextFrame::get_ParentCell zwraca właściciela, a ITextFrame::get_ParentShape zwraca nullptr, mimo że sama tabela jest kształtem.
Koordynaty komórki są dostępne za pośrednictwem metod tylko do odczytu ICell::get_FirstColumnIndex i ICell::get_FirstRowIndex. ITextFrame::get_ParentCell również zapewnia nawigację tylko do odczytu: zwraca właściciela, ale nie zmienia własności. Zawsze sprawdzaj, czy zwrócona komórka nie jest nullptr przed jej użyciem.
Pełny przykład identyfikujący właścicieli komórek tabeli i kształtów, w tym kształty powiązane z węzłami SmartArt, znajdziesz w Wyszukiwanie i zamiana tekstu.
Wyrównanie tekstu w tabeli
- Utwórz instancję klasy Presentation.
- Uzyskaj odniesienie do slajdu za pomocą jego indeksu.
- Dodaj obiekt ITable do slajdu.
- Uzyskaj dostęp do obiektu ITextFrame z tabeli.
- Uzyskaj dostęp do IParagraph obiektu ITextFrame.
- Wyrównaj tekst pionowo.
- Zapisz zmodyfikowaną prezentację.
Ten kod C++ pokazuje, jak wyrównać tekst w tabeli:
#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/ISlideCollection.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;
// Tworzy instancję klasy Presentation
auto presentation = System::MakeObject<Presentation>();
// Uzyskuje pierwszy slajd
auto slide = presentation->get_Slides()->idx_get(0);
// Definiuje kolumny o szerokościach i wiersze o wysokościach
auto dblCols = System::MakeArray<double>({ 120, 120, 120, 120 });
auto dblRows = System::MakeArray<double>({ 100, 100, 100, 100 });
// Dodaje kształt tabeli do slajdu
auto tbl = slide->get_Shapes()->AddTable(100.0f, 50.0f, dblCols, dblRows);
tbl->idx_get(1, 0)->get_TextFrame()->set_Text(u"10");
tbl->idx_get(2, 0)->get_TextFrame()->set_Text(u"20");
tbl->idx_get(3, 0)->get_TextFrame()->set_Text(u"30");
// Uzyskuje dostęp do ramki tekstowej
auto txtFrame = tbl->idx_get(0, 0)->get_TextFrame();
// Tworzy obiekt Paragraph dla ramki tekstowej
auto paragraph = txtFrame->get_Paragraphs()->idx_get(0);
// Tworzy obiekt Portion dla akapitu
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());
// Wyrównuje tekst pionowo
auto cell = tbl->idx_get(0, 0);
cell->set_TextAnchorType(TextAnchorType::Center);
cell->set_TextVerticalType(TextVerticalType::Vertical270);
// Zapisuje prezentację na dysk
presentation->Save(u"Vertical_Align_Text_out.pptx", SaveFormat::Pptx);
Ustaw formatowanie tekstu na poziomie tabeli
- Utwórz instancję klasy Presentation.
- Uzyskaj odniesienie do slajdu za pomocą jego indeksu.
- Uzyskaj dostęp do obiektu ITable ze slajdu.
- Ustaw set_FontHeight() dla tekstu.
- Ustaw set_Alignment() oraz set_MarginRight().
- Ustaw set_TextVerticalType().
- Zapisz zmodyfikowaną prezentację.
Ten kod C++ pokazuje, jak zastosować wybrane opcje formatowania do tekstu w tabeli:
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.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;
// Tworzy instancję klasy Presentation
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slides()->idx_get(0);
// Załóżmy, że pierwszy kształt na pierwszym slajdzie jest tabelą
auto someTable = System::AsCast<ITable>(presentation->get_Slides()->idx_get(0)->get_Shapes()->idx_get(0));
// Ustawia wysokość czcionki komórek tabeli
auto portionFormat = System::MakeObject<PortionFormat>();
portionFormat->set_FontHeight(25.0f);
someTable->SetTextFormat(portionFormat);
// Ustawia wyrównanie tekstu komórek tabeli oraz prawy margines w jednym wywołaniu
auto paragraphFormat = System::MakeObject<ParagraphFormat>();
paragraphFormat->set_Alignment(TextAlignment::Right);
paragraphFormat->set_MarginRight(20.0f);
someTable->SetTextFormat(paragraphFormat);
// Ustawia pionowy typ tekstu komórek tabeli
auto textFrameFormat = System::MakeObject<TextFrameFormat>();
textFrameFormat->set_TextVerticalType(TextVerticalType::Vertical);
someTable->SetTextFormat(textFrameFormat);
presentation->Save(u"result.pptx", SaveFormat::Pptx);
Pobranie właściwości stylu tabeli
Aspose.Slides pozwala pobrać właściwości stylu tabeli, aby można było użyć ich przy innej tabeli lub w innym miejscu. Ten kod C++ pokazuje, jak uzyskać właściwości stylu z predefiniowanego stylu tabeli:
#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>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto pres = System::MakeObject<Presentation>();
auto shapes = pres->get_Slide(0)->get_Shapes();
auto table = System::ExplicitCast<ITable>(shapes->AddTable(10, 10, System::MakeArray<double>({100, 150}), System::MakeArray<double>({5, 5, 5})));
table->set_StylePreset(TableStylePreset::DarkStyle1);
pres->Save(u"table.pptx", SaveFormat::Pptx);
Zablokowanie proporcji tabeli
Proporcje geometrycznego kształtu to stosunek jego wymiarów w różnych kierunkach. Aspose.Slides udostępnia właściwość AspectRatioLocked(), która pozwala zablokować ustawienie proporcji dla tabel i innych kształtów.
Ten kod C++ pokazuje, jak zablokować proporcje tabeli:
#include <DOM/IGraphicalObjectLock.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.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 pres = System::MakeObject<Presentation>(u"pres.pptx");
auto table = System::ExplicitCast<ITable>(pres->get_Slides()->idx_get(0)->get_Shapes()->idx_get(0));
Console::WriteLine(u"Lock aspect ratio set: {0}", table->get_GraphicalObjectLock()->get_AspectRatioLocked());
table->get_GraphicalObjectLock()->set_AspectRatioLocked(!table->get_GraphicalObjectLock()->get_AspectRatioLocked());
Console::WriteLine(u"Lock aspect ratio set: {0}", table->get_GraphicalObjectLock()->get_AspectRatioLocked());
pres->Save(u"pres-out.pptx", SaveFormat::Pptx);
FAQ
Czy mogę włączyć kierunek czytania od prawej do lewej (RTL) dla całej tabeli i tekstu w jej komórkach?
Tak. Tabela udostępnia metodę set_RightToLeft, a akapity mają ParagraphFormat::set_RightToLeft. Użycie obu zapewnia prawidłowy porządek RTL oraz renderowanie wewnątrz komórek.
Jak mogę zapobiec przenoszeniu lub zmianie rozmiaru tabeli w finalnym pliku?
Użyj shape locks, aby wyłączyć przenoszenie, zmianę rozmiaru, zaznaczanie itp. Te blokady działają również na tabele.
Czy wstawianie obrazu jako tła wewnątrz komórki jest obsługiwane?
Tak. Możesz ustawić picture fill dla komórki; obraz pokryje obszar komórki zgodnie z wybranym trybem (rozciąganie lub kafelkowanie).