Как разделить таблицу на новый слайд 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/