Как да работим с таблици в C++
Aspose.Slides FOSS for C++ supports creating tables on slides with configurable column widths and row heights. This guide shows how to add a table, populate it with data, and apply basic text formatting to cells.
Ръководство стъпка по стъпка
Стъпка 1: Сглобете и свържете библиотеката
git clone https://github.com/aspose-slides-foss/Aspose.Slides-FOSS-for-Cpp.git
cd Aspose.Slides-FOSS-for-Cpp && mkdir build && cd build
cmake .. && cmake --build .Стъпка 2: Създаване или отваряне на презентация
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& slide = prs.slides()[0];
// ... add table ...
prs.save("table.pptx", asf::SaveFormat::PPTX);
return 0;
}Стъпка 3: Определяне на ширини на колоните и височини на редовете
Таблиците изискват явни ширини на колоните и височини на редовете в точки (1 точка = 1/72 инч). Стандартен слайд е широк 720 точки и висок 540 точки.
std::vector<double> col_widths = {200.0, 150.0, 150.0}; // 3 columns
std::vector<double> row_heights = {45.0, 40.0, 40.0}; // 3 rows
Стъпка 4: Добавяне на таблицата
slide.shapes().add_table(x, y, col_widths, row_heights) създава таблицата на позиция (x, y):
#include <Aspose/Slides/Foss/presentation.h>
#include <vector>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& slide = prs.slides()[0];
std::vector<double> col_widths = {200.0, 150.0, 150.0};
std::vector<double> row_heights = {45.0, 40.0, 40.0};
auto& table = slide.shapes().add_table(50, 100, col_widths, row_heights);
prs.save("table.pptx", asf::SaveFormat::PPTX);
return 0;
}Стъпка 5: Задаване на текст в клетка
Достъпвайте клетки чрез table.rows()[row_index][col_index] и задайте текст чрез .text_frame()->set_text():
#include <Aspose/Slides/Foss/presentation.h>
#include <vector>
#include <string>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& slide = prs.slides()[0];
std::vector<double> col_widths = {200.0, 150.0, 150.0};
std::vector<double> row_heights = {45.0, 40.0, 40.0};
auto& table = slide.shapes().add_table(50, 100, col_widths, row_heights);
// Header row (row 0)
std::vector<std::string> headers = {"Product", "Units Sold", "Revenue"};
for (size_t col = 0; col < headers.size(); ++col) {
table.rows()[0][col].text_frame()->set_text(headers[col]);
}
// Data rows
std::vector<std::vector<std::string>> data = {
{"Widget A", "1,200", "$24,000"},
{"Widget B", "850", "$17,000"},
};
for (size_t r = 0; r < data.size(); ++r) {
for (size_t c = 0; c < data[r].size(); ++c) {
table.rows()[r + 1][c].text_frame()->set_text(data[r][c]);
}
}
prs.save("sales-table.pptx", asf::SaveFormat::PPTX);
return 0;
}Стъпка 6: Форматиране на текста в заглавната клетка
Приложете удебелено форматиране към заглавните клетки, използвайки PortionFormat:
for (size_t col = 0; col < headers.size(); ++col) {
auto& cell = table.rows()[0][col];
auto& portions = cell.text_frame()->paragraphs()[0].portions();
if (portions.size() > 0) {
auto& fmt = portions[0].portion_format();
fmt.set_font_bold(asf::NullableBool::TRUE);
fmt.fill_format().set_fill_type(asf::FillType::SOLID);
fmt.fill_format().solid_fill_color().set_color(
asf::Color::from_argb(255, 255, 255, 255));
}
}Пълен работещ пример
#include <Aspose/Slides/Foss/presentation.h>
#include <vector>
#include <string>
#include <iostream>
int main() {
namespace asf = Aspose::Slides::Foss;
std::vector<std::vector<std::string>> data_rows = {
{"North", "$1.2M", "+8%"},
{"South", "$0.9M", "+4%"},
{"East", "$1.5M", "+12%"},
{"West", "$0.7M", "+2%"},
};
std::vector<std::string> headers = {"Region", "Revenue", "Growth"};
asf::Presentation prs;
auto& slide = prs.slides()[0];
std::vector<double> col_widths = {180.0, 140.0, 120.0};
std::vector<double> row_heights(1 + data_rows.size(), 38.0);
row_heights[0] = 45.0;
auto& table = slide.shapes().add_table(60, 80, col_widths, row_heights);
// Header row
for (size_t col = 0; col < headers.size(); ++col) {
auto& cell = table.rows()[0][col];
cell.text_frame()->set_text(headers[col]);
auto& portions = cell.text_frame()->paragraphs()[0].portions();
if (portions.size() > 0) {
portions[0].portion_format().set_font_bold(asf::NullableBool::TRUE);
}
}
// Data rows
for (size_t r = 0; r < data_rows.size(); ++r) {
for (size_t c = 0; c < data_rows[r].size(); ++c) {
table.rows()[r + 1][c].text_frame()->set_text(data_rows[r][c]);
}
}
prs.save("regional-revenue.pptx", asf::SaveFormat::PPTX);
std::cout << "Saved regional-revenue.pptx\n";
return 0;
}Чести проблеми и решения
std::out_of_range при достъпване table.rows()[row][col]
Индексите за редове и колони започват от нула. Ако сте дефинирали row_heights с 3 елемента, валидните индекси за редове са 0, 1, 2.
Текстът в клетката не се появява в запазения файл
Винаги задавайте чрез .text_frame()->set_text(), не чрез .set_text() директно върху обекта cell.
Позицията на таблицата е извън слайда
Проверете, че x + sum(col_widths) <= 720 и y + sum(row_heights) <= 540 за стандартен слайд.
Често задавани въпроси
Мога ли да обединя клетки в таблицата?
Обединяването на клетки не се поддържа в това издание.
Мога ли да приложа цвят на фона за цялата таблица?
Приложете форматиране на запълване към всяка отделна клетка:
for (size_t r = 0; r < table.rows().size(); ++r) {
for (size_t c = 0; c < table.rows()[r].size(); ++c) {
auto& cell = table.rows()[r][c];
cell.fill_format().set_fill_type(asf::FillType::SOLID);
cell.fill_format().solid_fill_color().set_color(
asf::Color::from_argb(255, 240, 248, 255));
}
}Мога ли да задавам стилове на границите на клетките?
Свойствата на границите на клетките са достъпни чрез методите за граници на форматирането на клетките. Вижте справочника на API за пълен списък с атрибутите на форматиране на границите.