OpenXML, высота таблицы PresentationML и высота строки при переносе слов - PullRequest
4 голосов
/ 05 марта 2012

Я новичок в 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 ]

1 голос
/ 06 марта 2012

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

1 голос
/ 06 марта 2012

Если вы можете предположить, что все вышеперечисленные столбцы имеют фиксированную ширину, за исключением первого столбца, в котором используется product.Name, и ваш стиль шрифта такой же, то вы можете использовать следующий метод вместо проверки таблицывысота> граница.

Сначала откройте свою презентацию в PowerPoint и перейдите к слайду с таблицей.Введите в свой столбец фиксированной ширины данных.Затем в первом столбце введите «XXXX ....», пока не произойдет разрыв строки. Подсчитайте количество символов до переноса строки. Это число будет maxLengthBeforeBreak

Во-вторых, очистите строку от первогошаг выше и введите в аналогичную строку, которая не разрывается с линии. Скопируйте и вставьте эту строку вниз и заполните таблицу на слайде, пока не получите максимальное количество строк для слайда, который выглядит привлекательным для пользователя. Это количество строкбудет maxTableRowsPerSlide

Теперь, когда вы заполняете каждый слайд строками, подсчитайте количество строк, вставляемых в переменную rowCount. Вставьте строки, пока rowCount <<code>maxTableRowsPerSlide, затем запустите новый слайд.

И для каждой строки - если длина product.Name равна> maxLengthBeforeOverflow, вы можете увеличить rowCount, разделив длину product.Name на maxLengthBeforeOverflow, чтобы получить число строк, которые переносит эта строка.

...