OpenXML, Высота представления таблицы PresentationML и Высота строки при переносе слов
Я новичок в Open Xml и создал приложение для создания отчетов с использованием Open Xml SDK. Он заполняет данные в таблицу, а когда высота таблицы превышает границу слайда, клонируйте слайд и заполняете следующий набор данных на новых слайдах и так далее. Все работает нормально, но когда некоторые строки содержат данные, которые переносятся в 2 строки, не удается перейти на новую страницу в том же месте. Кажется, причина в том, что Open Xml по-прежнему возвращает высоту строки, такую же, как высота строки, когда есть одна строка данных. Есть ли способ решить это?
Вот фрагмент кода, который выполняет логику разбиения на страницы (CreateTextCell - это метод, который создает текстовую ячейку и возвращает):
var tbl = current.Slide.Descendants<A.Table>().First();
var tr = new A.TableRow();
tr.Height = 200000;
tr.Append(CreateTextCell(product.Name));
tr.Append(CreateTextCell(product.ProductNumber));
tr.Append(CreateTextCell(product.Size));
tr.Append(CreateTextCell(String.Format("{0:00}", product.ListPrice)));
tr.Append(CreateTextCell(product.SellStartDate.ToShortDateString()));
tbl.Append(tr);
totalHeight += tr.Height;
if (totalHeight > pageBorder)
overflow = true;
2 ответа
У меня был очень похожий вопрос, и я обнаружил, что высота таблицы не обновляется при заполнении таблицы с помощью Open XML SDK. Он обновляется только тогда, когда презентация действительно открывается в Power Point. Это, очевидно, не поможет вам разобраться в коде, когда нужно разделить таблицу на новый слайд, но если вы попробуете этот ответ, это может помочь.
Если вы можете предположить, что все ваши столбцы выше фиксированной ширины, за исключением первого столбца, где product.Name
используется, и ваш стиль шрифта такой же, тогда вы можете использовать следующий метод вместо проверки высоты таблицы> границы.
Сначала откройте свою презентацию в PowerPoint и перейдите к слайду с таблицей. Введите в свой столбец фиксированной ширины данных. Затем в первом столбце введите "XXXX....", пока не произойдет разрыв строки. Подсчитайте количество символов до переноса строки. Это число будет maxLengthBeforeBreak
Во-вторых, очистите строку с первого шага выше и введите аналогичную строку, которая не разрывается. Скопируйте и вставьте эту строку вниз и заполните таблицу на слайде, пока у вас не появится максимальное количество строк для слайда, которое выглядит привлекательным для пользователя. Это количество строк будет maxTableRowsPerSlide
Теперь, когда вы заполняете каждый слайд строками, посчитайте количество строк, которые вы вставили в rowCount
переменная. Вставьте строки в то время как rowCount
< maxTableRowsPerSlide
, затем начните новый слайд.
И для каждого ряда - если длина product.Name
это> maxLengthBeforeOverflow
Вы можете увеличить rowCount
разделив product.Name
длина по maxLengthBeforeOverflow
чтобы получить число строк, которые обертывают этот ряд.