إدارة خلايا الجداول في العروض التقديمية باستخدام PHP
نظرة عامة
Aspose.Slides يتيح لك الوصول إلى خلايا الجداول وتعديلها في عروض PowerPoint. توضح هذه المقالة كيفية تحديد خلايا الجداول المدمجة، إزالة حدود الخلية، العمل مع ترقيم الخلايا بعد دمجها أو تقسيمها، تغيير لون خلفية الخلية، وإضافة صورة داخل خلية جدول. تظهر الأمثلة كيفية إنشاء أو فتح عرض تقديمي، الحصول على جدول من شريحة، تحديث تنسيق الخلية عبر خصائص الخلية، وحفظ العرض المعدل كملف PPTX.
Aspose.Slides يستخدم مؤشرات صفرية للوصول إلى خلايا الجداول بالترتيب (column, row).
تحديد خلية جدول مدمجة
يفتح المثال عرضًا تقديميًا موجودًا ويصل إلى الشكل الأول في الشريحة الأولى كجدول. يفترض أن الشريحة والشكل موجودان وأن الشكل هو جدول. ثم يتنقل عبر جميع الصفوف والأعمدة ويستخدم isMergedCell لتحديد الخلايا في المناطق المدمجة. لكل تطابق، يطبع إحداثيات الخلية بالترتيب row;column، getRowSpan، getColSpan، وإحداثيات بداية المنطقة، getFirstRowIndex وgetFirstColumnIndex.
use aspose\slides\Presentation;
$presentation = new Presentation("presentation_with_table.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$table = $slide->getShapes()->get_Item(0);
$rowCount = java_values($table->getRows()->size());
for ($rowIndex = 0; $rowIndex < $rowCount; $rowIndex++)
{
$columnCount = java_values($table->getColumns()->size());
for ($columnIndex = 0; $columnIndex < $columnCount; $columnIndex++)
{
$cell = $table->get_Item($columnIndex, $rowIndex);
if (java_values($cell->isMergedCell()))
{
printf("Cell %d;%d belongs to a merged region with RowSpan=%d and ColSpan=%d starting at %d;%d.\n", $rowIndex, $columnIndex, java_values($cell->getRowSpan()), java_values($cell->getColSpan()), java_values($cell->getFirstRowIndex()), java_values($cell->getFirstColumnIndex()));
}
}
}
} finally {
$presentation->dispose();
}
إزالة حدود خلية الجدول
إنشاء Presentation وإضافة جدول إلى شريحته الأولى باستخدام addTable. تُحدد أعرض الأعمدة، ارتفاعات الصفوف، وموقع الجدول بالنقاط. يضبط المثال جميع الحدود الأربعة للخلية إلى FillType::NoFill، مما يجعلها غير مرئية.
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$columnWidths = [ 50, 50, 50, 50 ];
$rowHeights = [ 50, 30, 30, 30, 30 ];
$table = $slide->getShapes()->addTable(100, 50, $columnWidths, $rowHeights);
for ($rowIndex = 0; $rowIndex < java_values($table->getRows()->size()); $rowIndex++) {
for ($columnIndex = 0; $columnIndex < java_values($table->getColumns()->size()); $columnIndex++) {
$cell = $table->get_Item($columnIndex, $rowIndex);
$cell->getCellFormat()->getBorderTop()->getFillFormat()->setFillType(FillType::NoFill);
$cell->getCellFormat()->getBorderBottom()->getFillFormat()->setFillType(FillType::NoFill);
$cell->getCellFormat()->getBorderLeft()->getFillFormat()->setFillType(FillType::NoFill);
$cell->getCellFormat()->getBorderRight()->getFillFormat()->setFillType(FillType::NoFill);
}
}
$presentation->save("table.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
دمج خلايا الجدول
استخدام mergeCells لدمج نطاق مستطيل من خلايا الجدول في خلية واحدة. حدد الخلايا في الزاوية العلوية اليسرى واليمنى السفلية للنطاق. يتحكم الوسيط النهائي فيما إذا كان الدمج قد يشمل خلايا خارج النطاق المحدد؛ false يبقي الدمج داخل ذلك النطاق.
ينشئ المثال جدولًا 4×4 بأعمدة وصفوف 70 نقطة، ثم يدمج الأربع خلايا المركزية من (1, 1) عبر (2, 2). الخلية الناتجة تمتد عمودين وصفين، بينما يظل شبكة الجدول الأساسية بأربعة أعمدة وأربعة صفوف. للوصول إلى محتوى الخلية المدمجة أو تنسيقها، استخدم موضعها العلوي الأيسر: $table->get_Item(1, 1) في هذا المثال. تبقى المواضع الأخرى في النطاق المدمج جزءًا من شبكة الجدول، لذا لا تتغير مؤشرات الخلايا خارج النطاق.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$columnWidths = [ 70, 70, 70, 70 ];
$rowHeights = [ 70, 70, 70, 70 ];
$table = $slide->getShapes()->addTable(100, 50, $columnWidths, $rowHeights);
$table->mergeCells($table->get_Item(1, 1), $table->get_Item(2, 2), false);
$presentation->save("merged_cells.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
تقسيم خلايا الجدول
يحافظ دمج الخلايا في المثال السابق على شبكة الجدول. قد يؤدي تقسيم خلية إلى إدخال عمود شبكة جديد وتغيير مؤشرات الأعمدة للخلايا التي على يمينها. يتبع Aspose.Slides نموذج شبكة جداول PowerPoint.
ينشئ هذا المثال جدولًا 4×4 بأعمدة وصفوف 70 نقطة ويستدعي splitByWidth على الخلية (1, 1). يتم تمرير نصف عرض الخلية البالغ 70 نقطة لإنشاء خليتين متساويتين العرض.
بعد هذا التقسيم، يتم الوصول إلى النصفين كـ $table->get_Item(1, 1) و$table->get_Item(2, 1). أصبحت شبكة الجدول الآن تحتوي على خمسة أعمدة: تنتقل الخلايا التي كانت في الأعمدة 2 و3 إلى الأعمدة 3 و4 على التوالي. تبقى مؤشرات الصفوف دون تغيير. استخدم هذه المؤشرات المحدثة للأعمدة عند الوصول إلى الخلايا بعد التقسيم.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$columnWidths = [ 70, 70, 70, 70 ];
$rowHeights = [ 70, 70, 70, 70 ];
$table = $slide->getShapes()->addTable(100, 50, $columnWidths, $rowHeights);
$table->get_Item(1, 1)->splitByWidth(java_values($table->get_Item(1, 1)->getWidth()) / 2);
$presentation->save("split_cells.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
تقسيم الخلايا المدمجة حسب الصف أو العمود
لتحضير خلايا القالب المدمجة لتعبئة البيانات، استخدم splitByRowSpan للتقسيم على طول حد صف موجود، أو splitByColSpan للتقسيم على طول حد عمود.
المعامل index يُعد الصفوف في الجزء العلوي أو الأعمدة في الجزء الأيسر من التقسيم؛ وهو نسبي إلى المنطقة المدمجة:
- تقسيم الصف:
0 < index <getRowSpan. - تقسيم العمود:
0 < index <getColSpan.
يفترض المثال وجود عرض تقديمي يحتوي على جدول كأول شكل في الشريحة الأولى، مع دمج (1, 2) و(1, 3) عموديًا. بدءًا من الموضع السفلي، يستخدم getFirstColumnIndex وgetFirstRowIndex لتحديد الأصل ويفحص كلا النطاقين. splitByRowSpan(1) ثم يفصل الصفين 2 و3 لأسماء المنتجات. لدمج أفقي بعمودين، استخدم splitByColSpan(1) بدلاً من ذلك.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("table_template.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$table = $slide->getShapes()->get_Item(0);
$selectedCell = $table->get_Item(1, 3);
$firstColumnIndex = java_values($selectedCell->getFirstColumnIndex());
$firstRowIndex = java_values($selectedCell->getFirstRowIndex());
$mergedCell = $table->get_Item($firstColumnIndex, $firstRowIndex);
if (java_values($mergedCell->isMergedCell()) && java_values($mergedCell->getRowSpan()) == 2 && java_values($mergedCell->getColSpan()) == 1)
{
$mergedCell->splitByRowSpan(1);
// استرجاع الخلايا الناتجة من الجدول بعد التقسيم.
$upperCell = $table->get_Item($firstColumnIndex, $firstRowIndex);
$lowerCell = $table->get_Item($firstColumnIndex, $firstRowIndex + 1);
echo "Upper cell merged: " . (java_values($upperCell->isMergedCell()) ? "true" : "false") . PHP_EOL;
echo "Lower cell merged: " . (java_values($lowerCell->isMergedCell()) ? "true" : "false") . PHP_EOL;
$upperCell->getTextFrame()->setText("Product A");
$lowerCell->getTextFrame()->setText("Product B");
$presentation->save("split_template.pptx", SaveFormat::Pptx);
}
else
{
echo "Select a merged region spanning exactly two rows and one column." . PHP_EOL;
}
} finally {
$presentation->dispose();
}
تبقى شبكة الجدول ومؤشرات الخلايا المجاورة دون تغيير. استرجع الخلايا الناتجة حسب إحداثياتها؛ هنا، كلاهما يمتلك امتدادات مقدارها 1 وisMergedCell يُظهر false. يمكن أن تبقى المناطق الأكبر مدمجة جزئيًا بعد تقسيم واحد.
النص الأصلي وتنسيقه يبقى في الخلية العليا (أو اليسرى)؛ الخلية الجديدة تكون فارغة لكنها ترث تنسيق الخلية مثل التعبئة، الحدود، والهوامش. قم بملء الخلايا بعد التقسيم وتعيين أي تنسيق نص مطلوب صراحةً.
العرض المحفوظ يحتوي على خلايا “منتج A” و"منتج B" منفصلة مع الحفاظ على تنسيق خلية القالب. راجع Cell API Reference للمزيد من التفاصيل.
تغيير لون خلفية خلية الجدول
ينشئ هذا المثال جدولًا بأعمدة 150 نقطة وصفوف 50 نقطة. يستخدم setFillType لاختيار تعبئة صلبة ويضبط اللون المرجع من getSolidFillColor إلى الأحمر للخلية (2, 3), في العمود الثالث والصف الرابع.
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$columnWidths = [ 150, 150, 150, 150 ];
$rowHeights = [ 50, 50, 50, 50, 50 ];
$table = $slide->getShapes()->addTable(50, 50, $columnWidths, $rowHeights);
$cell = $table->get_Item(2, 3);
$cell->getCellFormat()->getFillFormat()->setFillType(FillType::Solid);
$cell->getCellFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
$presentation->save("cell_background_color.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
إضافة صورة داخل خلية جدول
ضع صورة الإدخال في دليل العمل قبل تشغيل هذا المثال. يقوم بتحميل الصورة باستخدام Images::fromFile ويضيفها إلى مجموعة صور العرض باستخدام addImage. ثم يعين الصورة إلى تعبئة الصورة للخلية (0, 0), الخلية الأولى في الجدول.
PictureFillMode::Stretch يمد الصورة لملء الخلية، مما قد يغير نسبة أبعادها. أعرض الأعمدة وارتفاعات الصفوف بالنقاط. تُخلص الصورة المحملة في كتلة finally بعد إضافتها إلى العرض.
use aspose\slides\FillType;
use aspose\slides\Images;
use aspose\slides\PictureFillMode;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$columnWidths = [ 150, 150, 150, 150 ];
$rowHeights = [ 100, 100, 100, 100, 90 ];
$table = $slide->getShapes()->addTable(50, 50, $columnWidths, $rowHeights);
$image = Images::fromFile("aspose_logo.jpg");
try {
$ppImage = $presentation->getImages()->addImage($image);
} finally {
$image->dispose();
}
$table->get_Item(0, 0)->getCellFormat()->getFillFormat()->setFillType(FillType::Picture);
$table->get_Item(0, 0)->getCellFormat()->getFillFormat()->getPictureFillFormat()->setPictureFillMode(PictureFillMode::Stretch);
$table->get_Item(0, 0)->getCellFormat()->getFillFormat()->getPictureFillFormat()->getPicture()->setImage($ppImage);
$presentation->save("table_cell_with_image.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
الأسئلة المتكررة
هل يمكنني تعيين سماكات خطوط وأنماط مختلفة لجوانب خلية واحدة؟
نعم. حدود top/bottom/left/right لها خصائص مستقلة، لذا يمكن أن تختلف السماكة والنمط لكل جانب.
ماذا يحدث للصورة إذا قمت بتغيير حجم العمود/الصف بعد تعيين صورة كخلفية للخلية؟
السلوك يعتمد على fill mode (تمتد/تكرار). عند التمدد، تتكيف الصورة مع الخلية الجديدة؛ وعند التكرار، يُعاد حساب البلاط.
هل يمكنني ربط ارتباط تشعبي بجميع محتوى خلية؟
Hyperlinks تُحدد على مستوى النص (الجزء) داخل إطار نص الخلية أو على مستوى الجدول/الشكل بالكامل. عمليًا، تقوم بتعيين الرابط إلى جزء أو إلى كل النص داخل الخلية.
هل يمكنني تعيين خطوط مختلفة داخل خلية واحدة؟
نعم. يدعم إطار نص الخلية portions (تشغيلات) مع تنسيق مستقل—عائلة الخط، النمط، الحجم، واللون.