2016-03-25 28 views
1

私はReportLabの新しいページテンプレートです。私は2ページのテンプレートがあるレポートを作成する必要があります。最初のページはヘッダーページテンプレートを使用し、他のすべてのページは共通テンプレートを使用します。レポートは、テーブルを複数のページに分割する必要があります。最初のページテーブルでは、より幅の狭いフレームに表示し、残りのテーブルを残りのページの広いフレームに表示する必要があります。Reportlabテーブル分割

異なるページ間でテーブルを分割するとき、列の幅とテーブルのスタイルを変更するにはどうすればよいですか?

編集:ここで私は成功し、それはに基づいて(自動的にそうすることはできないようですすべてのページにわたって、通常のTable

# ReportLab PDF Generation Library 
from reportlab.pdfgen  import canvas 
from reportlab.lib.units  import inch, cm 
from reportlab.lib.pagesizes import letter, landscape 
from reportlab.lib   import colors 

from reportlab.lib.styles import getSampleStyleSheet 
from reportlab.platypus import BaseDocTemplate, Frame, Paragraph, NextPageTemplate, PageBreak, PageTemplate, Spacer 
from reportlab.platypus.tables import Table, TableStyle 

# Constants 
Font_Leading = 10 
Word_Spacing = 0.0 
Char_Spacing = 0.08 

#global table 
data= [['DATE', 'NAME', 'ITEM', 'AMOUNT', 'BALANCE'], 
    ['01/12/15', 'William', 'ITEM1 RELATED STUFF', '365.00', '43.30'] 
    # CONSIDER MANY MORE ITEMS HERE 
    # NUMBER FO ITMES VARYING IN WAY TO CAUSE 1 OR MORE PAGES 
    # 3RD COLUMN WILL HAVE DESCRIPTIVE ITEM 
    # WHICH WILL REPLACE WITH PARAGARPHS LATER ON 
    ] 
t=Table(data,repeatRows=1, 
    colWidths=[.7*inch, 1*inch, 2.4*inch, .8*inch, .8*inch]) 
#The top left cell is (0, 0) the bottom right is (-1, -1). 
tStyle = TableStyle([ 
    # All Cells 
    ('FONTSIZE', (0,0), (-1,-1), 8), 
    ('TOPPADDING', (0,0), (-1,-1), 0), 
    ('BOTTOMPADDING', (0,0), (-1,-1), 0), 
    ('VALIGN', (0,0), (-1,-1), 'TOP'), 
    ('LEADING', (0,0), (-1,-1), 10), 
    # Top row 
    ('BACKGROUND', (0,0), (-1,0), colors.maroon), 
    ('TEXTCOLOR', (0,0), (-1,0), colors.white), 
    ('ALIGN', (0,0), (-1,0), 'CENTRE'), 
    # 3RD and 4th column, 
    ('ALIGN', (3,0), (4,-1), 'RIGHT'), 
    # Line commands 
    # All 
    ('BOX',(0,0),(-1,-1),.5,colors.black), 
    # top row 
    ('GRID',(0,0),(-1,0),.5,colors.black), 
    # all columns 
    ('LINEBEFORE',(0,0),(-1,-1),.5,colors.black), 
    # last column 
    ('LINEAFTER',(-1,0),(-1,-1),.5,colors.black), 
    # last row 
    ('LINEBELOW',(0,-1),(-1,-1),.5,colors.black)]) 
t.setStyle(tStyle) 

def othPg(c, doc): 
    t.colWidths = [.2*inch, .2*inch,4*inch, .2*inch, .2*inch] 
    tStyle.add('BACKGROUND',(0,0),(-1,-1),colors.lightblue) 
    x=1 

def pgHdr(c, doc): 
    width,height = letter 
    c.saveState() 
    c.translate(.3 * inch, 0 * inch) 

# STUFF RELATED TO 2 INCH STTIC HEADER FOR FIRST PAGE 
    c.restoreState() 


def main(): 
    pdf_file = 'stmt.pdf' 
    Elements = [] 
    doc = BaseDocTemplate(pdf_file, 
         pagesize=letter, 
         leftMargin=.3*inch, 
         rightMargin= .1 * inch, 
         topMargin= .1 * inch, 
         bottomMargin=.3 * inch, 
         showBoundary=1) 
    #normal frame as for SimpleFlowDocument 
    frameT = Frame(doc.leftMargin + 2*inch, doc.bottomMargin, doc.width - 2.01*inch, doc.height - 4.1*inch, id='normal', showBoundary=0) 
    frameB = Frame(doc.leftMargin+2, doc.bottomMargin, 7.5*inch, 10*inch, id='small', showBoundary=1) 



    doc.addPageTemplates([PageTemplate(id='First',frames=frameT,onPage=pgHdr), 
         PageTemplate(id='Later',frames=frameB,onPage=othPg) 
         ]) 
    Elements.append(NextPageTemplate('Later')) 
    Elements.append(t) 
    doc.build(Elements) 

if __name__ == "__main__": 
    sys.exit(main()) 

答えて

1

を分割したが、同じ幅でテーブルを保持いくつかのコードを入れていますsource code)。分割時に列幅を保持するようにしました。ページ分割後に表のレイアウトを変更すると、エンドユーザーにとって混乱を招く恐れがあります。

Tableの列サイズを変更する独自のバージョンを作成できますが、のかなり複雑なsplit関数を上書きする必要があります。それはお尻の痛みになります。

したがって、最も簡単でおそらく最も実行可能な解決策は、両方のテンプレートのフレームを同じ幅にすることです。その後、列の幅をまったく変更する必要はありません。

編集: OPの依頼で、私は実際に後のページのスタイルと列の幅に熟達するオプションを検討しました。

class LaterPagesTable(Table): 
    def __init__(self, data, laterColWidths=None, laterStyle=None, **kwargs): 
     Table.__init__(self, data, **kwargs) 

     self._later_column_widths = laterColWidths 
     self._later_style = laterStyle 


    def split(self, availWidth, availHeight): 
     self._calc(availWidth, availHeight) 
     if self.splitByRow: 
      if not rl_config.allowTableBoundsErrors and self._width>availWidth: return [] 
      tables = self._splitRows(availHeight) 

      if len(tables): 
       self.onLaterPages(tables[1]) 
      return tables 
     else: 
      raise NotImplementedError 


    def onLaterPages(self, T): 
     if self._later_column_widths: 
      T._argW = self._later_column_widths 

     if self._later_style: 
      T.setStyle(self._later_style) 

このクラスは、ユーザーが構文はまったく同じとなっているキーワード引数とlaterStyleを使用して、後でページのスタイルおよびcolumnWidthのを指定することができます。これに基づき、私はReportlabs Tableに基づいて次のクラスを作成しました通常のcolWidthsstyleのように表示されますが、元のページの外側に配置された表の部分でのみ使用されます。

+0

テーブルが大きすぎるため、最初のページだけがスペースが少なくなるため、これは実行可能な解決策ではありません。フレームサイズに基づいてデータを分割する方法を提案して、最初のページテンプレートの2つのテーブルを作成し、残りのすべてのページに分割する2つのテーブルを作成できるようにしてください。 – bvnbhati

+0

その場合の問題を示すコードを教えてください。そうすれば、もっと簡単に解決できます。 – B8vrede

+0

@bvnbhatiあなたが探している振る舞いを提供できるはずのコードをいくつか追加しました。 – B8vrede

関連する問題