Python ReportLab использует splitfirst/splitlast

Я пытаюсь использовать Python с ReportLab 2.2 для создания отчета в формате PDF.
По словам пользователя руководство,

Специальные индексы TableStyle [так в оригинале]

В любой команде стиля индекс первой строки может быть установлен в одну из специальных строк «splitlast» или «splitfirst», чтобы указать, что стиль следует использовать только для последней строки разделенной таблицы или первой строки продолжения. Это позволяет разделить таблицы с более приятными эффектами вокруг разделения.

Я пробовал использовать несколько элементов стиля, в том числе:

('TEXTCOLOR', (0, 'splitfirst'), (1, 'splitfirst'), colors.black) 
('TEXTCOLOR', (0, 'splitfirst'), (1, 0), colors.black) 
('TEXTCOLOR', (0, 'splitfirst'), (1, -1), colors.black) 

и ни один из них, кажется, не работает. Первый генерирует TypeError с сообщением:

TypeError: cannot concatenate 'str' and 'int' objects

а последние два генерируют TypeErrors с сообщением:

TypeError: an integer is required

Эта функция просто сломана или я что-то не так делаю? Если второе, то что я делаю не так?


person DLJessup    schedule 16.09.2008    source источник


Ответы (3)


Что ж, похоже, я сам отвечу на свой вопрос.

Во-первых, в документации прямо говорится: «В любой команде стиля индекс первой строки может быть установлен в одну из специальных строк «splitlast» или «splitfirst», чтобы указать, что стиль должен использоваться только для последней строки. разделить таблицу или первую строку продолжения». В текущем выпуске индексы строк «splitlast» и «splitfirst» разрываются из-за вышеупомянутых ошибок типа в командах TEXTCOLOR и BACKGROUND.

Мое подозрение, основанное на чтении исходного кода, заключается в том, что только команды строк таблицы (GRID, BOX, LINEABOVE и LINEBELOW) в настоящее время совместимы с индексами строк «splitfirst» и «splitlast». Я подозреваю, что все команды ячеек ломаются с вышеупомянутыми ошибками типа.

Однако я смог сделать то, что хотел, создав подкласс класса Table и переопределив метод onSplit. Вот мой код:

class XTable(Table):
    def onSplit(self, T, byRow=1):
        T.setStyle(TableStyle([
          ('TEXTCOLOR', (0, 1), (1, 1), colors.black)]))

Что это делает, так это применяет черный цвет текста к первой и второй ячейке второй строки каждой страницы. (Первая строка — это заголовок, повторяемый параметром RepeatRows таблицы.) Точнее, это происходит с первой и второй ячейкой каждого фрейма, но поскольку я использую шаблон SimpleDocTemplate, фреймы и страницы идентичны.

person DLJessup    schedule 18.09.2008

Похоже, это ошибка в классе ReportLab Table. Другое исправление для этого в дополнение к собственному ответу DLJessup заключается в изменении кода ReportLab, вызывающего ошибку, в Table._drawBkgrnd() вокруг строки 1301. Для «сплитласта» изменить:

y0 = rowpositions[sr]

to:

if sr == 'splitlast':
    y0 = rowpositions[-2] # last value is 0.  Second last is the one we want.
else:
   y0 = rowpositions[sr]

Это легко сделать в вашем собственном коде без взлома ReportLab путем создания подкласса Table и перезаписи этого метода. У меня не было необходимости использовать «splitfirst»; если я это сделаю, я опубликую остальную часть взлома здесь.

person Robin Macharg    schedule 12.04.2010

[...] В любой команде стиля индекс первой строки может быть установлен на одну из специальных [...]

В первом примере вы также устанавливаете для индекса строки второй специальную строку.

Не уверен, почему два других не работают... Вы уверены, что это исключение?

person dF.    schedule 17.09.2008
comment
У меня было время посмотреть исходный код ReportLab. Похоже, что должно произойти то, что индекс начальной и конечной строк заменяется индексом строки начала страницы по мере раскручивания программы. Если это работает правильно, индекс второй строки не должен иметь значения. - person DLJessup; 18.09.2008