Hantera tabellceller i presentationer med Java

Översikt

Aspose.Slides gör det möjligt att komma åt och ändra tabelceller i PowerPoint-presentationer. Den här artikeln förklarar hur man identifierar sammanslagna tabelceller, tar bort cellramar, arbetar med celldatering efter sammanslagning eller uppdelning av celler, ändrar en cells bakgrundsfärg och lägger till en bild i en tabelcell. Exemplen visar hur man skapar eller öppnar en presentation, hämtar en tabell från en bild, uppdaterar cellformatering via cellegenskaper och sparar den ändrade presentationen som en PPTX-fil.

Aspose.Slides använder nollbaserade index för att komma åt tabelceller i ordningen (column, row).

Identifiera en sammanslagen tabelcell

Exemplet öppnar en befintlig presentation och får åtkomst till den första formen på den första bilden som en tabell. Det förutsätter att bilden och formen finns samt att formen är en tabell. Det itererar sedan genom alla rader och kolumner och använder isMergedCell för att identifiera celler i sammanslagna områden. För varje träff skriver det ut cellkoordinaterna i ordningen row;column, getRowSpan, getColSpan, och områdets startkoordinater, getFirstRowIndex och getFirstColumnIndex.

import com.aspose.slides.*;

Presentation presentation = new Presentation("presentation_with_table.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    ITable table = (ITable) slide.getShapes().get_Item(0);

    int rowCount = table.getRows().size();
    for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
    {
        int columnCount = table.getColumns().size();
        for (int columnIndex = 0; columnIndex < columnCount; columnIndex++)
        {
            ICell cell = table.get_Item(columnIndex, rowIndex);
            if (cell.isMergedCell())
            {
                System.out.printf("Cell %d;%d belongs to a merged region with RowSpan=%d and ColSpan=%d starting at %d;%d.%n", rowIndex, columnIndex, cell.getRowSpan(), cell.getColSpan(), cell.getFirstRowIndex(), cell.getFirstColumnIndex());
            }
        }
    }
} finally {
    presentation.dispose();
}

Ta bort tabellcellens kanter

Skapa en Presentation och lägg till en tabell på dess första bild med addTable. Kolumnbredder, radhöjder och tabllets position anges i punkter. Exemplet sätter alla fyra cellkanter till FillType.NoFill, vilket gör dem osynliga.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    double[] columnWidths = { 50, 50, 50, 50 };
    double[] rowHeights = { 50, 30, 30, 30, 30 };
    ITable table = slide.getShapes().addTable(100, 50, columnWidths, rowHeights);

    for (IRow row : table.getRows())
        for (ICell cell : row)
        {
            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();
}

Sammanfoga tabellceller

Använd mergeCells för att kombinera ett rektangulärt område av tabellceller till en cell. Ange cellerna i det övre vänstra och nedre högra hörnet av området. Det sista argumentet styr om sammanslagningen kan omfatta celler utanför det angivna området; false behåller sammanslagningen inom det området.

Exemplet skapar en 4‑× 4‑tabell med 70‑punkts kolumner och rader, och sammanfogar sedan de fyra centrala cellerna från (1, 1) till (2, 2). Den resulterande cellen spänner över två kolumner och två rader, medan tabellens underliggande rutnät behåller fyra kolumner och fyra rader. För att komma åt den sammanslagna cellens innehåll eller formatering, använd dess övre vänstra position: table.get_Item(1, 1) i detta exempel. De andra positionerna i det sammanslagna området förblir en del av tabellrutnätet, så indexen för celler utanför området ändras inte.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    double[] columnWidths = { 70, 70, 70, 70 };
    double[] rowHeights = { 70, 70, 70, 70 };
    ITable 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();
}

Dela tabellceller

Att sammanfoga celler i föregående exempel bevarar tabellens rutnät. Att dela en cell kan introducera en ny rutnätskolumn och förändra kolumnindex för celler till dess högra sida. Aspose.Slides följer PowerPoints tabellrutnätsmodell.

Detta exempel skapar en 4‑× 4‑tabell med 70‑punkts kolumner och rader och anropar splitByWidth på cell (1, 1). Hälften av cellens 70‑punkts bredd skickas för att skapa två lika breda celler.

Efter denna delning nås de två halvorna som table.get_Item(1, 1) och table.get_Item(2, 1). Tabellrutnätet har nu fem kolumner: celler som ursprungligen låg i kolumn 2 och 3 flyttas till kolumn 3 respektive 4. Radräknarna förblir oförändrade. Använd dessa uppdaterade kolumnindex när du kommer åt celler efter delningen.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    double[] columnWidths = { 70, 70, 70, 70 };
    double[] rowHeights = { 70, 70, 70, 70 };
    ITable table = slide.getShapes().addTable(100, 50, columnWidths, rowHeights);

    table.get_Item(1, 1).splitByWidth(table.get_Item(1, 1).getWidth() / 2);

    presentation.save("split_cells.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Dela sammanslagna celler efter rad‑ eller kolumnspann

För att förbereda sammanslagna mallceller för datainmatning, använd splitByRowSpan för att dela längs en befintlig radrubrik, eller splitByColSpan för att dela längs en kolumnrubrik.

index‑argumentet räknar rader i den övre delen eller kolumner i den vänstra delen av delningen; det är relativt till det sammanslagna området:

Exemplet förutsätter att en presentation har en tabell som den första formen på den första bilden, med (1, 2) och (1, 3) sammanslagna vertikalt. Med start från den lägre positionen använder det getFirstColumnIndex och getFirstRowIndex för att lokalisera ursprunget och kontrollerar båda spannen. splitByRowSpan(1) separerar sedan raderna 2 och 3 för produktnamn. För en horisontell två‑kolumnssammanslagning, använd splitByColSpan(1) istället.

import com.aspose.slides.*;

Presentation presentation = new Presentation("table_template.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    ITable table = (ITable) slide.getShapes().get_Item(0);

    ICell selectedCell = table.get_Item(1, 3);
    int firstColumnIndex = selectedCell.getFirstColumnIndex();
    int firstRowIndex = selectedCell.getFirstRowIndex();
    ICell mergedCell = table.get_Item(firstColumnIndex, firstRowIndex);

    if (mergedCell.isMergedCell() && mergedCell.getRowSpan() == 2 && mergedCell.getColSpan() == 1)
    {
        mergedCell.splitByRowSpan(1);

        // Hämta de resulterande cellerna från tabellen efter delning.
        ICell upperCell = table.get_Item(firstColumnIndex, firstRowIndex);
        ICell lowerCell = table.get_Item(firstColumnIndex, firstRowIndex + 1);
        System.out.println("Upper cell merged: " + upperCell.isMergedCell());
        System.out.println("Lower cell merged: " + lowerCell.isMergedCell());

        upperCell.getTextFrame().setText("Product A");
        lowerCell.getTextFrame().setText("Product B");

        presentation.save("split_template.pptx", SaveFormat.Pptx);
    }
    else
    {
        System.out.println("Select a merged region spanning exactly two rows and one column.");
    }
} finally {
    presentation.dispose();
}

Tabellrutnätet och omkringliggande cellindex förblir oförändrade. Hämta de resulterande cellerna via deras koordinater; här har båda spann på 1 och isMergedCell skriver ut false. Större områden kan förbli delvis sammanslagna efter en delning.

Den ursprungliga texten och dess formatering förblir i den övre (eller vänstra) cellen; den nya cellen är tom men ärver cellformatering såsom fyllning, kanter och marginaler. Fyll i cellerna efter delning och ange eventuell nödvändig textformatering explicit.

Den sparade presentationen innehåller separata “Product A” och “Product B”-celler med mallens cellformatering bevarad. Se Cell API Reference för detaljer.

Ändra tabellcellens bakgrundsfärg

Detta exempel skapar en tabell med 150‑punkts kolumner och 50‑punkts rader. Det använder setFillType för att välja en solid fyllning och sätter färgen som returneras av getSolidFillColor till rött för cell (2, 3), i den tredje kolumnen och fjärde raden.

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

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    double[] columnWidths = { 150, 150, 150, 150 };
    double[] rowHeights = { 50, 50, 50, 50, 50 };
    ITable table = slide.getShapes().addTable(50, 50, columnWidths, rowHeights);

    ICell cell = table.get_Item(2, 3);
    cell.getCellFormat().getFillFormat().setFillType(FillType.Solid);
    cell.getCellFormat().getFillFormat().getSolidFillColor().setColor(Color.RED);

    presentation.save("cell_background_color.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Lägg till en bild i en tabellcell

Placera inmatningsbilden i arbetskatalogen innan du kör detta exempel. Den laddar bilden med Images.fromFile och lägger till den i presentationens bildsamling med addImage. Den tilldelar sedan bilden till bildfyllningen för cell (0, 0), den första cellen i tabellen.

PictureFillMode.Stretch sträcker bilden för att fylla cellen, vilket kan ändra dess bildförhållande. Kolumnbredder och radhöjder är i punkter. Den inlästa bilden frigörs i ett finally‑block efter att den har lagts till i presentationen.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    
    double[] columnWidths = { 150, 150, 150, 150 };
    double[] rowHeights = { 100, 100, 100, 100, 90 };
    ITable table = slide.getShapes().addTable(50, 50, columnWidths, rowHeights);

    IPPImage ppImage;
    IImage 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();
}

Vanliga frågor

Kan jag ange olika linjetjocklekar och stilar för olika sidor av en enskild cell?

Ja. top/bottom/left/right kanter har separata egenskaper, så tjocklek och stil för varje sida kan skilja sig.

Vad händer med bilden om jag ändrar kolumn‑/radstorleken efter att ha satt en bild som cellens bakgrund?

Beteendet beror på fill mode. Vid stretching anpassas bilden till den nya cellen; vid tiling beräknas rutorna om.

Kan jag tilldela en hyperlänk till allt innehåll i en cell?

Hyperlinks sätts på text‑ (portion)‑nivå inne i cellens textram eller på hela tabellens/figurens nivå. I praktiken tilldelar du länken till en del eller till all text i cellen.

Kan jag ange olika teckensnitt i en enda cell?

Ja. En cells textram stödjer portions (segment) med oberoende formatering — teckensnitt, stil, storlek och färg.