2008-09-16 3 views
7

ReportLab 2.2와 함께 Python을 사용하여 PDF 보고서를 만들려고합니다. user guide 따르면
첫 번째 행 인덱스는 것을 나타 내기 위해 특수 캐릭터 'splitlast'또는 'splitfirst "중 하나로 설정 될 수있는 임의 스타일의 명령에Python ReportLab splitfirst/splitlast 사용

특수 TABLESTYLE 굴절률들 [SIC]

스타일은 분할 된 테이블의 마지막 행 또는 연속의 첫 번째 행에만 사용해야합니다. 이렇게하면 분할 주위에 더 좋은 효과가있는 분할 테이블을 만들 수 있습니다. 내가 포함, 여러 스타일 요소를 사용하여 시도했다

:

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

이들 중 어느 것도 작동하는 것 같다 없습니다.

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

후자 두 개의 메시지와 함께 TypeErrors를 생성합니다 :

TypeError: an integer is required 

이 기능은 단순히 깨진 아니면 내가 뭔가 잘못하고 오전 첫 번째는 메시지와 함께 형식 오류를 생성? 후자라면, 내가 뭘 잘못하고 있니?

답변

0

[...] 어떤 스타일의 명령 첫 번째 예에서 첫 번째 행 특수 문자열 중 하나로 설정할 수 있습니다 인덱스 [...]

에서 당신이 설정하는 두 번째 특수 문자열에 행 인덱스.

다른 두 가지가 작동하지 않는 이유는 확실하지 않습니다. 예외가 발생한 곳이 확실합니까?

+0

ReportLab의 소스 코드를 살펴볼 시간이있었습니다. 일어날 것으로 예상되는 것은 프로그램이 풀릴 때 시작 행과 끝 행 인덱스가 페이지 시작의 행 인덱스로 대체된다는 것입니다. 이것이 올바르게 작동하면 두 번째 행 인덱스는 중요하지 않습니다. – DLJessup

3

글쎄, 내가 내 자신의 질문에 대답하는 것처럼 보입니다.

첫 번째로, 문서의 플랫 아웃은 "모든 스타일 명령에서 첫 번째 행 인덱스가 특수 문자 'splitlast'또는 'splitfirst'중 하나로 설정되어 스타일이 분할 된 테이블의 마지막 행 또는 연속의 첫 번째 행을 표시합니다. " 현재 릴리스에서는 "splitlast"및 "splitfirst"행 인덱스가 TEXTCOLOR 및 BACKGROUND 명령에서 앞서 언급 한 TypeErrors로 중단됩니다.

소스 코드를 읽었을 때 의심스러운 사실은 tablestyle 행 명령 (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 클래스의 버그 인 것 같습니다.

y0 = rowpositions[sr] 

에 :

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

이를 DLJessup's own answer뿐만 아니라이 또 다른 수정, 변경 'splitlast'를 들어 라인 (1301)의 주위에, Table._drawBkgrnd()에서 오류를 일으키는 ReportLab 코드를 수정하는 것입니다 Table을 서브 클래스 화하고이 메소드를 덮어 쓰면 ReportLab을 해킹하지 않고도 자신의 코드에서 쉽게 수행 할 수 있습니다. 나는 'splitfirst'를 사용할 필요가 없었다. 만약 내가 해킹의 나머지 부분을 게시 할 것입니다.

관련 문제