Python ReportLab использование splitfirst / splitlast

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

Special TableStyle Indeces [sic]

In any style command the first row index may be set to one of the special strings 'splitlast' or 'splitfirst' to indicate that the style should be used only for the last row of a split table, or the first row of a continuation. This allows splitting tables with nicer effects around the 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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
0
1 976
3

Ответы 3

[...] In any style command the first row index may be set to one of the special strings [...]

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

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

У меня было время посмотреть исходный код ReportLab. Похоже, что должно произойти то, что как начальная строка, так и конечная строка будут заменены индексом строки начала страницы по мере того, как программа раскручивается. Если это работает правильно, индекс второй строки не имеет значения.

DLJessup 18.09.2008 00:19

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

Во-первых, в документации ровно сказано: «В любой команде стиля индекс первой строки может быть установлен на одну из специальных строк 'splitlast' или 'splitfirst', чтобы указать, что стиль следует использовать только для последней строки разделить таблицу или первую строку продолжения ". В текущем выпуске индексы строк «splitlast» и «splitfirst» разбиваются на вышеупомянутые ошибки TypeErrors в командах 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, кадры и страницы идентичны.

Похоже, это ошибка в классе 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»; если я это сделаю, я опубликую здесь остальную часть хака.

Другие вопросы по теме