2008-09-16 8 views
7

Я пытаюсь использовать Python с ReportLab 2.2 для создания отчета в формате PDF.
Согласно user guide,Python ReportLab использование splitfirst/splitlast

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

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

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

('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 

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

ответ

0

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

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

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

+0

У меня было время посмотреть исходный код ReportLab. Похоже, что должно случиться, что индекс начальной строки и конечной строки заменяется индексом строки начала страницы по мере отключения программы. Если это работает правильно, индекс второй строки не должен иметь значения. – DLJessup 2008-09-17 20:19:31

3

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

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

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

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

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

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

1

Это похоже на ошибку в классе ReportLab Table. Еще одно исправление для этого в дополнение к DLJessup's own answer это изменить код ReportLab, который вызывает ошибку, в Table._drawBkgrnd(), вокруг линии 1301. Для «splitlast», изменение:

y0 = rowpositions[sr] 

к:

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

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