Как разделить таблицу на новый слайд PowerPoint, когда содержимое стекает с текущего слайда, используя Open XML SDK 2.0

У меня есть куча данных, которые мне нужно экспортировать с веб-сайта в презентацию PowerPoint, и я использовал Open XML SDK 2.0 для выполнения этой задачи. У меня есть презентация PowerPoint, которую я использую с помощью инструмента повышения производительности Open XML SDK 2.0, чтобы сгенерировать код шаблона, который я могу использовать для восстановления экспорта.

На одном из этих слайдов у меня есть таблица, и необходимо добавить данные в эту таблицу и разбить ее на несколько слайдов, если таблица превышает нижнюю часть слайда. Подход, который я выбрал, состоит в том, чтобы определить высоту таблицы и, если она превышает высоту слайда, переместить это новое содержимое на следующий слайд. Я читал блог Брайана и Джонса о добавлении повторяющихся данных в слайд PowerPoint, но мой сценарий немного другой. Они используют следующий код:

A.Table tbl = current.Slide.Descendants<A.Table>().First();
A.TableRow tr = new A.TableRow();
tr.Height = heightInEmu;
tr.Append(CreateDrawingCell(imageRel + imageRelId));
tr.Append(CreateTextCell(category));
tr.Append(CreateTextCell(subcategory));
tr.Append(CreateTextCell(model));
tr.Append(CreateTextCell(price.ToString()));
tbl.Append(tr);
imageRelId++;

Это не будет работать для меня, так как они знают, какую высоту установить для строки таблицы, так как это будет высота изображения, но при добавлении различного количества текста я не знаю высоту заранее, поэтому я просто устанавливаю tr.Heightк значению по умолчанию. Вот моя попытка изобразить на высоте стола:

   A.Table tbl = tableSlide.Slide.Descendants<A.Table>().First();
   A.TableRow tr = new A.TableRow();
   tr.Height = 370840L;
   tr.Append(PowerPointUtilities.CreateTextCell("This");
   tr.Append(PowerPointUtilities.CreateTextCell("is"));
   tr.Append(PowerPointUtilities.CreateTextCell("a"));
   tr.Append(PowerPointUtilities.CreateTextCell("test"));
   tr.Append(PowerPointUtilities.CreateTextCell("Test"));
   tbl.Append(tr);
   tableSlide.Slide.Save();

   long tableHeight = PowerPointUtilities.TableHeight(tbl);

Вот вспомогательные методы:

public static A.TableCell CreateTextCell(string text)
{
    A.TableCell tableCell = new A.TableCell(
                            new A.TextBody(new A.BodyProperties(),
                            new A.Paragraph(new A.Run(new A.Text(text)))),
                            new A.TableCellProperties());
    return tableCell;
}

public static Int64Value TableHeight(A.Table table)
{
    long height = 0;

    foreach (var row in table.Descendants<A.TableRow>()
                             .Where(h => h.Height.HasValue))
    {
        height += row.Height.Value;
    }

    return height;
}

Это правильно добавляет новую строку таблицы в существующую таблицу, но когда я пытаюсь получить высоту таблицы, она возвращает исходную высоту, а не новую высоту. Новая высота означает высоту по умолчанию, которую я изначально установил, а не высоту после вставки большого количества текста. Кажется, высота корректируется только тогда, когда она открывается в PowerPoint.

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

Мой вопрос заключается в том, как определить высоту строки динамически добавляемой таблицы, поскольку она не обновляет высоту строки до ее открытия в PowerPoint? Есть ли другие способы определить, когда разделять контент на другой слайд при использовании Open XML SDK 2.0? Я открыт для любых предложений о лучшем подходе, который кто-то мог бы использовать, так как на эту тему не так много документации.

1 ответ

Это действительно отличный вопрос. Одна вещь, которую вы можете сделать, это измерить высоту и ширину шрифтов в System.Drawing.Text и создайте своего рода предварительный рендерер в коде, чтобы выяснить, приведет ли текст к выводу таблицы за пределы экрана. Было бы немного, чтобы отследить, например, на какую ширину обернуты шрифты и создаст новую линию, а затем пространство между линиями и полем ячеек. Это будет промежуточный итог, чтобы отслеживать высоту таблицы по общему количеству строк, которые она может содержать с вашим шрифтом, его размером и вашим подключенным текстом - и при этом оставаться в пределах слайд-холста. Но как только вы все это получите, это должно дать вам очень хорошее представление о том, нужен ли вам новый слайд.

Это хорошая статья, чтобы узнать, как измерить визуализированный текст в.NET: http://www.devsource.com/c/a/Languages/Text-Metrics-in-the-Net-Framework-Part-I/

Другие вопросы по тегам