Python ReportLab использует splitfirst / splitlast - PullRequest
7 голосов
/ 17 сентября 2008

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

Special TableStyle Indeces [sic]

В любой команде стиля индекс первой строки может быть установлен в одну из специальных строк '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

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

Ответы [ 3 ]

3 голосов
/ 18 сентября 2008

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

Во-первых, разметка документации лежит там, где она гласит: «В любой команде стиля индекс первой строки может быть установлен на одну из специальных строк« 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 голос
/ 12 апреля 2010

Кажется, это ошибка в классе ReportLab Table. Другое исправление для этого в дополнение к собственному ответу DLJessup заключается в изменении кода 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, создав подклассы Table и переписав этот метод. Мне не нужно было использовать «splitfirst»; если я сделаю это, я опубликую остальную часть хака здесь.

0 голосов
/ 17 сентября 2008

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

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

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

...