Hantera presentationstabeller i C++
Introduktion
Tabeller i PowerPoint organiserar information i rader och kolumner, vilket gör det enklare att läsa och jämföra värden.
Aspose.Slides tillhandahåller klassen Table, gränssnittet ITable, klassen Cell, gränssnittet ICell och andra typer för att låta dig skapa, uppdatera och hantera tabeller i presentationer.
Skapa en tabell från grunden
Skapa en tabell genom att ange dess position, kolumnbredder och radhöjder. Efter att ha lagt till den på en bild kan du formatera cellkanter, slå ihop celler och infoga text.
- Skapa en instans av klassen Presentation.
- Hämta en referens till bilden enligt dess index.
- Definiera en array med kolumnbredder i punkter.
- Definiera en array med radhöjder i punkter.
- Lägg till ett ITable-objekt på bilden via metoden AddTable.
- Iterera genom varje ICell för att applicera formatering på de övre, nedre, högra och vänstra kanterna.
- Slå ihop de två första cellerna i tabellens första rad.
- Få åtkomst till den sammanslagna cellen via dess metod get_TextFrame.
- Ange texten i den sammanslagna cellen.
- Spara den ändrade presentationen.
Exemplet nedan skapar en tabell med tre kolumner och fem rader på (100, 50) punkter. Den tillämpar röda kanter med en bredd på 5 punkter, slår ihop de två första cellerna i den första raden och sparar resultatet som 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);
Numrering i en standardtabell
I en standardtabell är cellindex nollbaserade och använder ordningen (kolumn, rad). Den första cellen har index (0, 0).
Till exempel numreras cellerna i en tabell med 4 kolumner och 4 rader på följande sätt:
| (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) |
Detta exempel skapar den 4 × 4‑tabell som visas ovan, med kolumnbredder och radhöjder på 70 punkter samt röda cellkanter med en bredd på 5 punkter. Koordinaterna illustrerar cellindex; exemplet lämnar cellerna tomma och sparar tabellen som 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);
Åtkomst till en befintlig tabell
Tabeller lagras i en bilds formsamling. Iterera genom formerna för att hitta en tabell, använd sedan gränssnittet ITable för att läsa eller uppdatera dess celler.
- Läs in presentationen med klassen Presentation.
- Hämta en referens till bilden som innehåller tabellen enligt dess index.
- Iterera genom IShape-objekten och stoppa när en tabell hittas. Om bilden innehåller flera tabeller, använd get_AlternativeText för att identifiera den du behöver.
- Uppdatera texten i mål‑cellen.
- Spara den ändrade presentationen.
Exemplet nedan öppnar UpdateExistingTable.pptx och hittar den första tabellen på den första bilden. Den sätter cellen i kolumn 0, rad 1 till New och sparar resultatet som table1_out.pptx. Inmatningen måste innehålla minst en bild, och den första tabellen på den bilden måste ha minst en kolumn och två rader.
#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);
}
För att ändra storlek på en rad i en befintlig tabell och förstå varför dess faktiska höjd kan överstiga det begärda minimumet, se Kontrollera radhöjd.
Hitta cellen som äger en textram
När generell textbearbetningskod får ett ITextFrame från en tabell, använd ITextFrame::get_ParentCell för att hämta den ägande ICell. För en textram i en tabellcell returnerar ITextFrame::get_ParentCell ägaren och ITextFrame::get_ParentShape returnerar nullptr, även om tabellen själv är en form.
Cellkoordinaterna är tillgängliga via de skrivskyddade metoderna ICell::get_FirstColumnIndex och ICell::get_FirstRowIndex. ITextFrame::get_ParentCell ger också skrivskyddad navigation: den returnerar ägaren men ändrar inte ägarskapet. Kontrollera alltid att den returnerade cellen inte är nullptr innan du använder den.
För ett komplett exempel som identifierar tabellcell‑ och formägare, inklusive former associerade med SmartArt‑noder, se Sök och ersätt text.
Justera text i en tabell
Du kan kontrollera vertikal förankring och textriktning för enskilda tabellceller. Exemplet i detta avsnitt centrerar text i den första cellen och roterar den 270 grader.
- Skapa en instans av klassen Presentation.
- Hämta en referens till bilden enligt dess index.
- Lägg till ett ITable-objekt på bilden.
- Få åtkomst till ett ITextFrame-objekt från tabellen.
- Hämta det första IParagraph-objektet och sätt dess text och färg.
- Ställ in cellens vertikala förankring och textriktning med set_TextAnchorType och set_TextVerticalType.
- Spara den ändrade presentationen.
Detta exempel skapar en 4 × 4‑tabell med kolumnbredder på 120 punkter och radhöjder på 100 punkter. Det formaterar texten i cell (0, 0), lägger till värden i de återstående cellerna i den första raden och sparar resultatet som 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);
Ställ in textformatering på tabellnivå
Använd SetTextFormat för att tillämpa textformatering på alla celler i en tabell. Dess överlagringar accepterar formatering av portion, stycke och textram, så du kan ange dessa egenskaper utan att iterera genom enskilda celler.
- Läs in presentationen med klassen Presentation.
- Hämta en referens till bilden enligt dess index.
- Hämta ett ITable-objekt från bilden.
- Ange teckenstorlek med set_FontHeight för texten.
- Ställ in styckejustering och högermarginal med set_Alignment och set_MarginRight.
- Ange textriktning med set_TextVerticalType.
- Spara den ändrade presentationen.
Exemplet nedan öppnar table.pptx, som måste innehålla minst en bild med en tabell som sin första form. Det anger teckenstorlek till 25 punkter, justerar stycken åt höger med en högermarginal på 20 punkter och gör texten vertikal. Den formaterade presentationen sparas som 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);
Hämta tabellstilsegenskaper
Använd get_StylePreset för att läsa en tabells förinställda stil och set_StylePreset för att tilldela den. Detta exempel tillämpar TableStylePreset::DarkStyle1 på en tabell, skriver ut förinställningsnamnet och tilldelar samma förinställning till en andra tabell. Båda tabellerna sparas i 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);
Låsa bildförhållandet för en tabell
En tabells bildförhållande är förhållandet mellan dess bredd och höjd. Använd set_AspectRatioLocked för att låsa detta förhållande för en tabell.
Exemplet nedan öppnar pres.pptx, som måste innehålla minst en bild med en tabell som sin första form. Det skriver ut det aktuella låstillståndet, aktiverar bildförhållandelåset, skriver ut det uppdaterade tillståndet (True) och sparar resultatet som 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);
Vanliga frågor
Kan jag aktivera läsriktning från höger till vänster (RTL) för en hel tabell och texten i dess celler?
Ja. Tabellen har en set_RightToLeft-metod, och stycken har ParagraphFormat::set_RightToLeft. Genom att använda båda säkerställs korrekt RTL‑ordning och rendering i cellerna.
Hur kan jag förhindra att användare flyttar eller ändrar storlek på en tabell i den slutliga filen?
Använd formulås för att inaktivera flytt, storleksändring, markering osv. Dessa lås gäller även tabeller.
Stöds det att infoga en bild i en cell som bakgrund?
Ja. Du kan sätta en bildfyllning för en cell; bilden kommer att täcka cellområdet enligt valt läge (stretch eller tile).