2008-09-16 15 views
7

Tôi đang cố gắng sử dụng Python với ReportLab 2.2 để tạo báo cáo PDF.
Theo user guide,Python ReportLab sử dụng splitfirst/splitlast

đặc biệt TableStyle indeces [sic]

Trong bất kỳ lệnh phong cách chỉ số hàng đầu tiên có thể được thiết lập để một trong những chuỗi đặc biệt 'splitlast' hoặc 'splitfirst' để chỉ ra rằng phong cách chỉ nên được sử dụng cho hàng cuối cùng của bảng phân tách hoặc hàng đầu tiên của sự tiếp tục. Điều này cho phép chia bảng với hiệu ứng đẹp hơn xung quanh việc chia tách.

Tôi đã thử sử dụng một số yếu tố phong cách, bao gồm:

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

và không ai trong số những vẻ làm việc. Là người đầu tiên tạo ra một TypeError với thông điệp:

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

và sau này hai tạo TypeErrors với thông điệp:

TypeError: an integer is required 

là chức năng này chỉ đơn giản là bị hỏng hoặc tôi đang làm điều gì sai? Nếu sau này, tôi đang làm gì sai?

Trả lời

0

[...] Trong bất kỳ lệnh phong cách hàng đầu tiên index có thể được thiết lập để một trong những chuỗi đặc biệt [...]

Trong ví dụ đầu tiên của bạn, bạn đang thiết chỉ số hàng giây thứ hai vào một chuỗi đặc biệt.

Không chắc chắn lý do tại sao hai cách kia không hoạt động ... Bạn có chắc đây là nơi có ngoại lệ không?

+0

Tôi đã có một chút thời gian để xem mã nguồn cho ReportLab. Có vẻ như những gì được cho là xảy ra là cả hàng bắt đầu và chỉ mục hàng kết thúc được thay thế bằng chỉ mục hàng của phần đầu của trang khi chương trình bung ra. Nếu điều này hoạt động đúng, chỉ mục hàng thứ hai không quan trọng. – DLJessup

3

Vâng, có vẻ như tôi sẽ trả lời câu hỏi của riêng tôi.

Đầu tiên, tài liệu hướng ra nằm ở chỗ nó đọc "Trong bất kỳ lệnh kiểu nào, chỉ mục hàng đầu tiên có thể được đặt thành một trong các chuỗi đặc biệt 'splitlast' hoặc 'splitfirst' để chỉ ra rằng kiểu chỉ được sử dụng cho hàng cuối cùng của một bảng phân chia, hoặc hàng đầu tiên của một sự tiếp tục. " Trong bản phát hành hiện tại, các chỉ số hàng "splitlast" và "splitfirst" phá vỡ với TypeErrors nói trên trên các giao dịch TEXTCOLOR và BACKGROUND.

Nghi ngờ của tôi, dựa trên việc đọc mã nguồn, chỉ có các lệnh dòng lệnh (GRID, BOX, LINEABOVE và LINEBELOW) hiện tương thích với chỉ mục hàng 'splitfirst' và 'splitlast'. Tôi nghi ngờ rằng tất cả các lệnh tế bào đều bị phá vỡ với TypeErrors nói trên.

Tuy nhiên, tôi có thể thực hiện những gì tôi muốn bằng cách phân lớp lớp con và ghi đè phương thức onSplit. Đây là mã của tôi:

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

Điều này áp dụng màu văn bản cho ô thứ nhất và ô thứ hai của hàng thứ hai của mỗi trang. (Hàng đầu tiên là một tiêu đề, được lặp lại bởi tham số repeatRows của Bảng.) Chính xác hơn, nó đang làm điều này với ô đầu tiên và thứ hai của mỗi khung, nhưng vì tôi đang sử dụng SimpleDocTemplate, các khung và các trang giống hệt nhau.

1

Điều này có vẻ là một lỗi trong lớp Bảng ReportLab. Một sửa chữa cho điều này, thêm vào DLJessup's own answer là để thay đổi mã ReportLab đó là gây ra lỗi, trong Table._drawBkgrnd(), xung quanh dòng 1301. Đối với 'splitlast', thay đổi:

y0 = rowpositions[sr] 

tới:

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

này được thực hiện dễ dàng trong mã của riêng bạn mà không cần hack ReportLab bằng cách phân lớp Bảng và ghi đè phương thức này. Tôi không cần phải sử dụng 'splitfirst'; nếu tôi làm, tôi sẽ đăng phần còn lại của hack ở đây.

Các vấn đề liên quan