2012-02-14 6 views
10

ReportLabを使用してPDF文書の表を作成していますが、結果は非常に喜んでいます。ReportLabのPDF出力のページ区切りで表の列ヘッダーを繰り返す方法

しかし、ページ区切りにまたがる表の見出しを繰り返す方法を見つけ出すことはできませんでした。

以下のコードは、ヘッダー行と99行のデータが続くtest.pdfをC:\ Tempに作成します。

最初のページで見出し行が大きく見えますが、2番目と3番目のページの上部で繰り返してください。

私は、SimpleDocTemplateを使用してこれを達成するために使用されてきたアプローチを知りたいと思います。

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Frame, Spacer 
from reportlab.lib import colors 
from reportlab.lib.units import cm 
from reportlab.lib.pagesizes import A3, A4, landscape, portrait 
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet 
from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY 
from reportlab.pdfgen import canvas 

pdfReportPages = "C:\\Temp\\test.pdf" 
doc = SimpleDocTemplate(pdfReportPages, pagesize=A4) 

# container for the "Flowable" objects 
elements = [] 
styles=getSampleStyleSheet() 
styleN = styles["Normal"] 

# Make heading for each column 
column1Heading = Paragraph("<para align=center>COLUMN ONE HEADING</para>",styles['Normal']) 
column2Heading = Paragraph("<para align=center>COLUMN TWO HEADING</para>",styles['Normal']) 
row_array = [column1Heading,column2Heading] 
tableHeading = [row_array] 
tH = Table(tableHeading, [6 * cm, 6 * cm])   # These are the column widths for the headings on the table 
tH.hAlign = 'LEFT' 
tblStyle = TableStyle([('TEXTCOLOR',(0,0),(-1,-1),colors.black), 
         ('VALIGN',(0,0),(-1,-1),'TOP'), 
         ('BOX',(0,0),(-1,-1),1,colors.black), 
         ('BOX',(0,0),(0,-1),1,colors.black)]) 
tblStyle.add('BACKGROUND',(0,0),(-1,-1),colors.lightblue) 
tH.setStyle(tblStyle) 
elements.append(tH) 

# Assemble rows of data for each column 
for i in range(1,100): 
    column1Data = Paragraph("<para align=center> " + "Row " + str(i) + " Column 1 Data" + "</font> </para>",styles['Normal']) 
    column2Data = Paragraph("<para align=center> " + "Row " + str(i) + " Column 2 Data" + "</font> </para>",styles['Normal']) 
    row_array = [column1Data,column2Data] 
    tableRow = [row_array] 
    tR=Table(tableRow, [6 * cm, 6 * cm]) 
    tR.hAlign = 'LEFT' 
    tR.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),colors.white), 
          ('TEXTCOLOR',(0,0),(-1,-1),colors.black), 
          ('VALIGN',(0,0),(-1,-1),'TOP'), 
          ('BOX',(0,0),(-1,-1),1,colors.black), 
          ('BOX',(0,0),(0,-1),1,colors.black)])) 
    elements.append(tR) 
    del tR 

elements.append(Spacer(1, 0.3 * cm)) 

doc.build(elements) 

答えて

11

ドキュメント(はい、私は知っているが、それは手動でこのようなものを見つけるために、時には難しい)から:

repeatRows引数が が繰り返されるべきである大手行数を指定しますテーブルはそれ自体を分割するように求められます。

テーブルを作成すると、これは渡すことができる引数の1つで、最初のn行を繰り返すヘッダー行に変換します。あなたは77ページ上のテキストのこの部分を見つけることができますが、表の作成に関するセクションでは、repeatRowsを使用して再考するゴードンの助言に従った後、これは私が開発したコードである76ページ

http://www.reportlab.com/docs/reportlab-userguide.pdf

+0

感謝ゴードンを発見した - 手動で私に戻って指し以下の答えとして私が追加するはるかに簡単で実用的なコード例を開発することができました。 – PolyGeo

15

で開始します、それは動作します!

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Frame, Spacer 
from reportlab.lib import colors 
from reportlab.lib.units import cm 
from reportlab.lib.pagesizes import A3, A4, landscape, portrait 
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet 
from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY 
from reportlab.pdfgen import canvas 

pdfReportPages = "C:\\Temp\\test.pdf" 
doc = SimpleDocTemplate(pdfReportPages, pagesize=A4) 

# container for the "Flowable" objects 
elements = [] 
styles=getSampleStyleSheet() 
styleN = styles["Normal"] 

# Make heading for each column and start data list 
column1Heading = "COLUMN ONE HEADING" 
column2Heading = "COLUMN TWO HEADING" 
# Assemble data for each column using simple loop to append it into data list 
data = [[column1Heading,column2Heading]] 
for i in range(1,100): 
    data.append([str(i),str(i)]) 

tableThatSplitsOverPages = Table(data, [6 * cm, 6 * cm], repeatRows=1) 
tableThatSplitsOverPages.hAlign = 'LEFT' 
tblStyle = TableStyle([('TEXTCOLOR',(0,0),(-1,-1),colors.black), 
         ('VALIGN',(0,0),(-1,-1),'TOP'), 
         ('LINEBELOW',(0,0),(-1,-1),1,colors.black), 
         ('BOX',(0,0),(-1,-1),1,colors.black), 
         ('BOX',(0,0),(0,-1),1,colors.black)]) 
tblStyle.add('BACKGROUND',(0,0),(1,0),colors.lightblue) 
tblStyle.add('BACKGROUND',(0,1),(-1,-1),colors.white) 
tableThatSplitsOverPages.setStyle(tblStyle) 
elements.append(tableThatSplitsOverPages) 

doc.build(elements) 
-3

この解決策は、2ページにあるテーブルのヘッダーを簡単に繰り返すことがわかりました。あなたのテーブルにあなたのCSSのこの行を追加してください:

-fs-table-paginate:paginate;

私はまた、強力なようだFPDFのクラス(私は一瞬のためにそれを必要としないので、私はそれをテストしていない)

http://interpid.eu/fpdf-table

+0

提案してくれてありがとうございますが、私の場合はCSSを使用していません - それがバックグラウンドで起こっていない限りです。 – PolyGeo