كيفية العمل مع الجداول في C++

كيفية العمل مع الجداول في C++

Aspose.Slides FOSS for C++ يدعم إنشاء جداول على الشرائح مع إمكانية ضبط عرض الأعمدة وارتفاع الصفوف. يوضح هذا الدليل كيفية إضافة جدول، وتعبئته بالبيانات، وتطبيق تنسيق نص أساسي على الخلايا.

دليل خطوة بخطوة

الخطوة 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/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() مباشرةً على كائن الخلية.

موضع الجدول خارج الشريحة

تحقق من 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 للحصول على القائمة الكاملة لسمات تنسيق الحدود.


انظر أيضًا

 العربية