إدارة جداول العروض التقديمية على Android

المقدمة

الجدول في PowerPoint هو طريقة فعّالة لعرض وتوضيح المعلومات. المعلومات الموجودة في شبكة من الخلايا (مرتبة في صفوف وأعمدة) تكون مباشرة وسهلة الفهم.

Aspose.Slides يوفر الفئة Table، الواجهة ITable، الفئة Cell، الواجهة ICell وأنواع أخرى لتتيح لك إنشاء وتحديث وإدارة الجداول في جميع أنواع العروض التقديمية.

إنشاء جدول من الصفر

  1. إنشاء نسخة من الفئة Presentation.
  2. الحصول على مرجع الشريحة عبر فهرسها.
  3. تعريف مصفوفة columnWidth.
  4. تعريف مصفوفة rowHeight.
  5. إضافة كائن ITable إلى الشريحة عبر طريقة addTable.
  6. تكرار عبر كل ICell لتطبيق التنسيق على الحدود العليا والسفلى واليمين واليسار.
  7. دمج الخليتين الأوليين في الصف الأول للجدول.
  8. الوصول إلى كائن ICell’s TextFrame.
  9. إضافة بعض النص إلى TextFrame.
  10. حفظ العرض التقديمي المعدل.
import com.aspose.slides.*;
import java.awt.Color;

// ينشئ كائن من فئة Presentation يمثل ملف PPTX
Presentation pres = new Presentation();
try {
    // الوصول إلى الشريحة الأولى
    ISlide sld = pres.getSlides().get_Item(0);

    // تعريف الأعمدة بعرضها والصفوف بارتفاعها
    double[] dblCols = {50, 50, 50};
    double[] dblRows = {50, 30, 30, 30, 30};

    // إضافة شكل جدول إلى الشريحة
    ITable tbl = sld.getShapes().addTable(100, 50, dblCols, dblRows);

    // تعيين تنسيق الحدود لكل خلية
    for (int row = 0; row < tbl.getRows().size(); row++)
    {
        for (int cell = 0; cell < tbl.getRows().get_Item(row).size(); cell++)
        {
            ICellFormat cellFormat = tbl.getRows().get_Item(row).get_Item(cell).getCellFormat();
            
            cellFormat.getBorderTop().getFillFormat().setFillType(FillType.Solid);
            cellFormat.getBorderTop().getFillFormat().getSolidFillColor().setColor(Color.RED);
            cellFormat.getBorderTop().setWidth(5);

            cellFormat.getBorderBottom().getFillFormat().setFillType(FillType.Solid);
            cellFormat.getBorderBottom().getFillFormat().getSolidFillColor().setColor(Color.RED);
            cellFormat.getBorderBottom().setWidth(5);

            cellFormat.getBorderLeft().getFillFormat().setFillType(FillType.Solid);
            cellFormat.getBorderLeft().getFillFormat().getSolidFillColor().setColor(Color.RED);
            cellFormat.getBorderLeft().setWidth(5);

            cellFormat.getBorderRight().getFillFormat().setFillType(FillType.Solid);
            cellFormat.getBorderRight().getFillFormat().getSolidFillColor().setColor(Color.RED);
            cellFormat.getBorderRight().setWidth(5);
        }
    }
    // دمج الخليتين 1 و 2 في الصف 1
    tbl.mergeCells(tbl.getRows().get_Item(0).get_Item(0), tbl.getRows().get_Item(0).get_Item(1), false);

    // إضافة بعض النص إلى الخلية المدموجة
    tbl.getRows().get_Item(0).get_Item(0).getTextFrame().setText("Merged Cells");

    // حفظ العرض التقديمي إلى القرص
    pres.save("table.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

الترقيم في جدول قياسي

في جدول قياسي، يكون ترقيم الخلايا بسيطًا ويبدأ من الصفر. تُرقم الخلية الأولى في الجدول كـ 0,0 (العمود 0، الصف 0).

على سبيل المثال، تُرقم الخلايا في جدول يحتوي على 4 أعمدة و4 صفوف بهذه الطريقة:

(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)

يظهر هذا الكود بلغة Java كيف تحدد ترقيم الخلايا في جدول:

import com.aspose.slides.*;
import java.awt.Color;

// ينشئ كائن من فئة Presentation يمثل ملف PPTX
Presentation pres = new Presentation();
try {
    // يصل إلى الشريحة الأولى
    ISlide sld = pres.getSlides().get_Item(0);

    // يحدد الأعمدة بعرضها والصفوف بارتفاعها
    double[] dblCols = { 70, 70, 70, 70 };
    double[] dblRows = { 70, 70, 70, 70 };

    // يضيف شكل جدول إلى الشريحة
    ITable tbl = sld.getShapes().addTable(100, 50, dblCols, dblRows);

    // يحدد تنسيق الحدود لكل خلية
    for (IRow row : tbl.getRows())
    {
        for (ICell cell : row)
        {
            cell.getCellFormat().getBorderTop().getFillFormat().setFillType(FillType.Solid);
            cell.getCellFormat().getBorderTop().getFillFormat().getSolidFillColor().setColor(Color.RED);
            cell.getCellFormat().getBorderTop().setWidth(5);

            cell.getCellFormat().getBorderBottom().getFillFormat().setFillType(FillType.Solid);
            cell.getCellFormat().getBorderBottom().getFillFormat().getSolidFillColor().setColor(Color.RED);
            cell.getCellFormat().getBorderBottom().setWidth(5);

            cell.getCellFormat().getBorderLeft().getFillFormat().setFillType(FillType.Solid);
            cell.getCellFormat().getBorderLeft().getFillFormat().getSolidFillColor().setColor(Color.RED);
            cell.getCellFormat().getBorderLeft().setWidth(5);

            cell.getCellFormat().getBorderRight().getFillFormat().setFillType(FillType.Solid);
            cell.getCellFormat().getBorderRight().getFillFormat().getSolidFillColor().setColor(Color.RED);
            cell.getCellFormat().getBorderRight().setWidth(5);
        }
    }

    // يحفظ العرض التقديمي إلى القرص
    pres.save("StandardTables_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

الوصول إلى جدول موجود

  1. إنشاء نسخة من الفئة Presentation.

  2. الحصول على مرجع للشفرة التي تحتوي على الجدول عبر فهرسها.

  3. إنشاء كائن ITable وتعيينه إلى null.

  4. تكرار عبر جميع كائنات IShape حتى يتم العثور على الجدول.

    إذا كنت تشك أن الشريحة التي تتعامل معها تحتوي على جدول واحد فقط، يمكنك ببساطة فحص جميع الأشكال التي تحتويها. عندما يتم التعرف على شكل كجدول، يمكنك تحويله إلى كائن Table. ولكن إذا كانت الشريحة تحتوي على عدة جداول، فمن الأفضل البحث عن الجدول الذي تحتاجه عبر طريقة setAlternativeText(String value).

  5. استخدم كائن [ITable] للعمل مع الجدول. في المثال أدناه، نقوم بتعيين نص خلية في الجدول.

  6. حفظ العرض التقديمي المعدل.

import com.aspose.slides.*;

// ينشئ فئة Presentation التي تمثل ملف PPTX
Presentation pres = new Presentation("UpdateExistingTable.pptx");
try {

    // يصل إلى الشريحة الأولى
    ISlide sld = pres.getSlides().get_Item(0);

    // يهيء TableEx كقيمة null
    ITable tbl = null;

    // يتكرر عبر الأشكال ويحدد مرجعًا إلى الجدول الموجود
    for (IShape shp : sld.getShapes()) 
    {
        if (shp instanceof ITable) 
        {
            tbl = (ITable) shp;
            // يضبط النص للعمود الأول من الصف الثاني
            tbl.get_Item(0, 1).getTextFrame().setText("New");
        }
    }
    
    // يحفظ العرض التقديمي المعدل إلى القرص
    pres.save("table1_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

إيجاد الخلية التي تملك إطار نص

عند استقبال كود معالجة نص عام لكائن ITextFrame من جدول، استخدم طريقة ITextFrame.getParentCell لاسترجاع ICell المالكة. بالنسبة لإطار نص خلية جدول، تُعيد ITextFrame.getParentCell المالك وتُعيد ITextFrame.getParentShape القيمة null، رغم أن الجدول نفسه يُعد شكلاً.

إحداثيات الخلية متاحة عبر الطريقتين القراءة فقط: ICell.getFirstColumnIndex و ICell.getFirstRowIndex. كما توفر ITextFrame.getParentCell تنقلاً قراءة فقط: تُعيد المالك ولكن لا تغير الملكية. تحقق دائمًا من أن الخلية المرجعة ليست null قبل استخدامها.

للحصول على مثال كامل يحدد مالكي خلية الجدول والشكل، بما في ذلك الأشكال المرتبطة بعُقَد SmartArt، راجع Search and Replace Text.

محاذاة النص في جدول

  1. إنشاء نسخة من الفئة Presentation.
  2. الحصول على مرجع الشريحة عبر فهرسها.
  3. إضافة كائن [ITable] إلى الشريحة.
  4. الوصول إلى كائن [ITextFrame] من الجدول.
  5. الوصول إلى [IParagraph] الخاص بـ [ITextFrame].
  6. محاذاة النص عموديًا.
  7. حفظ العرض التقديمي المعدل.
import com.aspose.slides.*;
import java.awt.Color;

// ينشئ نسخة من فئة Presentation
Presentation pres = new Presentation();
try {
    // يحصل على الشريحة الأولى 
    ISlide slide = pres.getSlides().get_Item(0);
    
    // يحدد الأعمدة بعرضها والصفوف بارتفاعها
    double[] dblCols = { 120, 120, 120, 120 };
    double[] dblRows = { 100, 100, 100, 100 };
    
    // يضيف شكل الجدول إلى الشريحة
    ITable tbl = slide.getShapes().addTable(100, 50, dblCols, dblRows);
    tbl.get_Item(1, 0).getTextFrame().setText("10");
    tbl.get_Item(2, 0).getTextFrame().setText("20");
    tbl.get_Item(3, 0).getTextFrame().setText("30");
    
    // يحصل على إطار النص
    ITextFrame txtFrame = tbl.get_Item(0, 0).getTextFrame();
    
    // ينشئ كائن الفقرة لإطار النص
    IParagraph paragraph = txtFrame.getParagraphs().get_Item(0);
    
    // ينشئ كائن الجزء للفقرة
    IPortion portion = paragraph.getPortions().get_Item(0);
    portion.setText("Text here");
    portion.getPortionFormat().getFillFormat().setFillType(FillType.Solid);
    portion.getPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
    
    // محاذاة النص عموديًا
    ICell cell = tbl.get_Item(0, 0);
    cell.setTextAnchorType(TextAnchorType.Center);
    cell.setTextVerticalType(TextVerticalType.Vertical270);
    
    // حفظ العرض التقديمي إلى القرص
    pres.save("Vertical_Align_Text_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

تعيين تنسيق النص على مستوى الجدول

  1. إنشاء نسخة من الفئة Presentation.
  2. الحصول على مرجع الشريحة عبر فهرسها.
  3. الوصول إلى كائن [ITable] من الشريحة.
  4. تعيين setFontHeight(float value) للنص.
  5. تعيين setAlignment(int value) و setMarginRight(float value).
  6. تعيين setTextVerticalType(byte value).
  7. حفظ العرض التقديمي المعدل.
import com.aspose.slides.*;

// ينشئ نسخة من فئة Presentation
Presentation pres = new Presentation("simpletable.pptx");
try {
    // لنفرض أن الشكل الأول في الشريحة الأولى هو جدول
    ITable someTable = (ITable) pres.getSlides().get_Item(0).getShapes().get_Item(0);
    
    // يحدد ارتفاع خط خلايا الجدول
    PortionFormat portionFormat = new PortionFormat();
    portionFormat.setFontHeight(25);
    someTable.setTextFormat(portionFormat);
    
    // يضبط محاذاة نص خلايا الجدول والهامش الأيمن في استدعاء واحد
    ParagraphFormat paragraphFormat = new ParagraphFormat();
    paragraphFormat.setAlignment(TextAlignment.Right);
    paragraphFormat.setMarginRight(20);
    someTable.setTextFormat(paragraphFormat);
    
    // يضبط نوع النص العمودي لخلايا الجدول
    TextFrameFormat textFrameFormat = new TextFrameFormat();
    textFrameFormat.setTextVerticalType(TextVerticalType.Vertical);
    someTable.setTextFormat(textFrameFormat);
    
    pres.save("result.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

الحصول على خصائص نمط الجدول

Aspose.Slides يسمح لك باسترجاع خصائص النمط لجدول حتى تتمكن من استخدام هذه التفاصيل لجدول آخر أو في مكان آخر. يوضح هذا الكود بلغة Java كيفية الحصول على خصائص النمط من نمط جدول مُعَد مسبقًا:

import com.aspose.slides.*;

Presentation pres = new Presentation();
try {
    ITable table = pres.getSlides().get_Item(0).getShapes().addTable(10, 10, new double[] { 100, 150 }, new double[] { 5, 5, 5 });
    table.setStylePreset(TableStylePreset.DarkStyle1); // تغيير نمط الإعداد الافتراضي للثيم

    // الحصول على نمط الإعداد للجدول
    int stylePreset = table.getStylePreset();
    System.out.println("Table style preset: " + stylePreset);

    // تطبيق نمط الإعداد المسترجع على جدول آخر
    ITable anotherTable = pres.getSlides().get_Item(0).getShapes().addTable(10, 100, new double[] { 100, 150 }, new double[] { 5, 5, 5 });
    anotherTable.setStylePreset(stylePreset);

    pres.save("table.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

قفل نسبة الأبعاد للجدول

نسبة أبعاد الشكل الهندسي هي نسبة أحجامه في أبعاد مختلفة. قدمت Aspose.Slides الخاصية setAspectRatioLocked لتتيح لك قفل إعداد نسبة الأبعاد للجداول وغيرها من الأشكال.

import com.aspose.slides.*;

Presentation pres = new Presentation("pres.pptx");
try {
    ITable table = (ITable)pres.getSlides().get_Item(0).getShapes().get_Item(0);
    System.out.println("Lock aspect ratio set: " + table.getGraphicalObjectLock().getAspectRatioLocked());

    table.getGraphicalObjectLock().setAspectRatioLocked(!table.getGraphicalObjectLock().getAspectRatioLocked()); // عكس

    System.out.println("Lock aspect ratio set: " + table.getGraphicalObjectLock().getAspectRatioLocked());

    pres.save("pres-out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

الأسئلة المتكررة

هل يمكنني تمكين اتجاه القراءة من اليمين إلى اليسار (RTL) لجدول كامل والنص داخل خلاياه؟

نعم. يوفّر الجدول طريقة setRightToLeft، وتملك الفقرات الطريقة ParagraphFormat.setRightToLeft. استخدام الطريقتين يضمن الترتيب الصحيح للـ RTL وعرضه داخل الخلايا.

كيف يمكنني منع المستخدمين من تحريك أو تغيير حجم جدول في الملف النهائي؟

استخدم أقفال الشكل لتعطيل التحريك، تغيير الحجم، التحديد، وما إلى ذلك. تُطبق هذه الأقفال على الجداول أيضًا.

هل يدعم إدراج صورة داخل خلية كخلفية؟

نعم. يمكنك تعيين picture fill للخلية؛ ستغطي الصورة مساحة الخلية وفقًا للوضع المحدد (تمدد أو تكرار).