Разделить таблицу на несколько слайдов в файле PowerPoint - PullRequest
0 голосов
/ 17 июня 2020

Я использую GemBox.Presentation и создаю большую таблицу в своем файле PPTX. Подобно в этом примере , например:

PresentationDocument presentation = new PresentationDocument();
Slide slide = presentation.Slides.AddNew(SlideLayoutType.Custom);

int rowCount = 100;

int columnCount = 4;
int columnWidth = 5;

Table table = slide.Content.AddTable(1, 1, columnCount * columnWidth, 0, LengthUnit.Centimeter);

for (int i = 0; i < columnCount; i++)
    table.Columns.AddNew(Length.From(5, LengthUnit.Centimeter));

for (int r = 0; r < rowCount; r++)
{
    TableRow row = table.Rows.AddNew(0);
    for (int c = 0; c < columnCount; c++)
    {
        TableCell cell = row.Cells.AddNew();
        TextParagraph paragraph = cell.Text.AddParagraph();
        TextRun run = paragraph.AddRun(string.Format("Cell {0}-{1}", r + 1, c + 1));
    }
}

presentation.Save("output.pptx");

Как и ожидалось, таблица не помещается на слайде:

PowerPoint slide with large table that doesn't fit

Итак, мне нужно разделить эту таблицу на несколько таблиц или несколько слайдов, чтобы каждая таблица поместилась на слайде и все строки были видны.

Как я могу это сделать?
Как я могу Я нахожу, превысит ли новый TableRow высоту Slide?

1 Ответ

1 голос
/ 22 июня 2020

Если у вас есть динамика c высота строк (например, некоторые ячейки могут содержать несколько строк текста), вам потребуется разбить содержимое на страницы.

Например, как показано ниже:

// Update row heights, note that this is a somewhat expensive task.
// You can think of it as if you're saving presentation to PDF or some other fixed-document type.
presentation.GetPaginator(new PaginatorOptions() { UpdateTableRowHeights = true });

DrawingLayout tableLayout = table.Frame.Layout;
double maxHeight = presentation.SlideSize.Height - tableLayout.Top;
double currentHeight = 0;

TableRowCollection sourceRows = table.Rows;
TableRowCollection newRows = null;
int currentRowIndex = 0;

// Split the main table into multiple new tables based on the row heights.
while (currentRowIndex < sourceRows.Count)
{
    currentHeight += sourceRows[currentRowIndex].Height;

    // Create new slide with new table.
    if (currentHeight > maxHeight)
    {
        currentHeight = sourceRows[currentRowIndex].Height;

        Slide newSlide = presentation.Slides.AddNew(SlideLayoutType.Blank);
        Table newTable = newSlide.Content.AddTable(tableLayout.Left, tableLayout.Top, tableLayout.Width, 0);

        foreach (var column in table.Columns)
            newTable.Columns.AddClone(column);
        
        newRows = newTable.Rows;
    }

    // Move row from the main table to a new table.
    if (newRows != null)
    {
        newRows.AddClone(sourceRows[currentRowIndex]);
        sourceRows.RemoveAt(currentRowIndex);
    }
    else
    {
        ++currentRowIndex;
    }
}

presentation.Save("output.pptx");

Если у вас постоянная высота строк, как показано на скриншоте, вы можете упростить это.

Например, как показано ниже:

int rowsPerSlide = 16;

TableRowCollection rows = table.Rows;
DrawingLayout layout = table.Frame.Layout;

for (int t = 1, tablesCount = (int)Math.Ceiling(rows.Count / (double)rowsPerSlide); t < tablesCount; t++)
{
    Slide newSlide = presentation.Slides.AddNew(SlideLayoutType.Blank);
    Table newTable = newSlide.Content.AddTable(layout.Left, layout.Top, layout.Width, 0);

    foreach (var column in table.Columns)
        newTable.Columns.AddClone(column);

    for (int r = rowsPerSlide, rowsCount = Math.Min(rowsPerSlide * 2, rows.Count); r < rowsCount; r++)
    {
        newTable.Rows.AddClone(rows[rowsPerSlide]);
        rows.RemoveAt(rowsPerSlide);
    }
}

presentation.Save("output.pptx");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...