Cách làm việc với bảng trong C++

Cách làm việc với bảng trong 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.

Hướng Dẫn Từng Bước

Bước 1: Xây dựng và Liên kết Thư viện

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 .

Bước 2: Tạo hoặc Mở một Bản trình bày

#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;
}

Bước 3: Xác định Độ rộng Cột và Chiều cao Hàng

Bảng yêu cầu độ rộng cột và chiều cao hàng được chỉ định rõ ràng bằng điểm (1 point = 1/72 inch). Một slide tiêu chuẩn có độ rộng 720 điểm và chiều cao 540 điểm.

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

Bước 4: Thêm Bảng

slide.shapes().add_table(x, y, col_widths, row_heights) tạo bảng tại vị trí (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;
}

Bước 5: Đặt Văn bản cho Ô

Truy cập các ô qua table.rows()[row_index][col_index] và gán văn bản thông qua .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;
}

Bước 6: Định dạng Văn bản Ô Tiêu đề

Áp dụng định dạng in đậm cho các ô tiêu đề bằng cách sử dụng 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));
    }
}

Ví dụ Hoạt động Đầy đủ

#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;
}

Các Vấn Đề Thường Gặp và Cách Khắc Phục

std::out_of_range khi truy cập table.rows()[row][col]

Chỉ số hàng và cột bắt đầu từ 0. Nếu bạn đã định nghĩa row_heights với 3 phần tử, các chỉ số hàng hợp lệ là 0, 1, 2.

Văn bản ô không hiển thị trong tệp đã lưu

Luôn gán thông qua .text_frame()->set_text(), không phải qua .set_text() trực tiếp trên đối tượng ô.

Vị trí bảng bị lệch khỏi slide

Kiểm tra rằng x + sum(col_widths) <= 720y + sum(row_heights) <= 540 cho một slide tiêu chuẩn.


Câu hỏi thường gặp

Tôi có thể hợp nhất các ô trong bảng không?

Việc hợp nhất ô không được hỗ trợ trong phiên bản này.

Tôi có thể áp dụng màu nền cho toàn bộ bảng không?

Áp dụng định dạng tô màu cho từng ô riêng lẻ:

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));
    }
}

Tôi có thể đặt kiểu viền cho ô không?

Các thuộc tính viền ô có thể truy cập thông qua các phương thức viền của định dạng ô. Tham khảo tài liệu API để biết danh sách đầy đủ các thuộc tính định dạng viền.


Xem thêm

 Tiếng Việt