Я пытаюсь использовать 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
Эта функция просто сломана или я что-то делаю не так? Если второе, что я делаю не так?






[...] In any style command the first row index may be set to one of the special strings [...]
В вашем первом примере вы также устанавливаете индекс строки второй в специальную строку.
Не уверен, почему два других не работают ... Вы уверены, что здесь возникло исключение?
Что ж, похоже, я отвечу на свой вопрос.
Во-первых, в документации ровно сказано: «В любой команде стиля индекс первой строки может быть установлен на одну из специальных строк '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»; если я это сделаю, я опубликую здесь остальную часть хака.
У меня было время посмотреть исходный код ReportLab. Похоже, что должно произойти то, что как начальная строка, так и конечная строка будут заменены индексом строки начала страницы по мере того, как программа раскручивается. Если это работает правильно, индекс второй строки не имеет значения.