2012-04-23 20 views
1

我正在生成足夠長的表以進入第二頁。我想實現的是在第二頁上SPAN 4行。我使用TableStyle中的follwing代碼來完成它。Python - Reportlab:爲什麼在第二頁的超過兩行的SPAN返回錯誤?

('SPAN', (0,38), (0,41)) 

兩行的量程雖然工作。 ( 'SPAN',(0,38),(0,39))

這裏有一個代碼:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from reportlab.platypus import SimpleDocTemplate, Table, LongTable, TableStyle, BaseDocTemplate, Frame, Paragraph, NextPageTemplate, PageTemplate 
from reportlab.lib.pagesizes import letter, inch 
from reportlab.lib import colors 

def testPdf(): 
    doc = BaseDocTemplate("testpdf.pdf",pagesize=letter, 
         rightMargin=72,leftMargin=72, 
         topMargin=72,bottomMargin=18, showBoundary=True) 
    width, height = letter 
    print width 
    print height 

    elements = [] 
    datas = [] 
    for x in range(1,50): 
     datas.append(
      [x,x+1] 
     ) 
    t=LongTable(datas) 

    tTableStyle=[ 
     ('SPAN', (0,38), (0,41)), 
     ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), 
     ('BOX', (0,0), (-1,-1), 0.25, colors.black), 
    ] 
    t.setStyle(TableStyle(tTableStyle)) 
    elements.append(t) 

    frameT = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='normal') 

    doc.addPageTemplates([PageTemplate(id='OneCol',frames=frameT)]) 

    doc.build(elements) 

if __name__ == '__main__': 
    testPdf() 

回答

1

我跑你的示例代碼,看到了同樣的問題。對於任何一起誰可能會感興趣的到來,導致錯誤的是:

Traceback (most recent call last): 
    File "./test.py", line 39, in <module> 
    testPdf() 
    File "./test.py", line 36, in testPdf 
    doc.build(elements) 
    File "/usr/local/greenplum-db/ext/python/lib/python2.6/site-packages/reportlab/platypus/doctemplate.py", line 880, in build 
    self.handle_flowable(flowables) 
    File "/usr/local/greenplum-db/ext/python/lib/python2.6/site-packages/reportlab/platypus/doctemplate.py", line 763, in handle_flowable 
    if frame.add(f, canv, trySplit=self.allowSplitting): 
    File "/usr/local/greenplum-db/ext/python/lib/python2.6/site-packages/reportlab/platypus/frames.py", line 159, in _add 
    w, h = flowable.wrap(aW, h) 
    File "/usr/local/greenplum-db/ext/python/lib/python2.6/site-packages/reportlab/platypus/tables.py", line 1113, in wrap 
    self._calc(availWidth, availHeight) 
    File "/usr/local/greenplum-db/ext/python/lib/python2.6/site-packages/reportlab/platypus/tables.py", line 587, in _calc 
    self._calc_height(availHeight,availWidth,W=W) 
    File "/usr/local/greenplum-db/ext/python/lib/python2.6/site-packages/reportlab/platypus/tables.py", line 553, in _calc_height 
    spanFixDim(H0,H,spanCons,lim=hmax) 
    File "/usr/local/greenplum-db/ext/python/lib/python2.6/site-packages/reportlab/platypus/tables.py", line 205, in spanFixDim 
    t = sum([V[x]+M.get(x,0) for x in xrange(x0,x1)]) 
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 

排序答案:這是一個ReportLab的錯誤,你需要將其報告給開發者。

長答案:我看過之前分裂的問題。當分裂是明顯可能的時候,(並且顯然仍然存在)混淆算法的情況,但是由於算法無法確定將哪個頁面放在哪個頁面上,所以算法最終拋出錯誤。它可以發生在奇怪的時候,當你不期待它,並且我知道沒有特別好的工作而不是自己手動分割東西(或者包裝流水線中的內容,但在你的情況下這不起作用)。

+0

感謝回覆gordon,對於我的應用程序,我手動分割了表格,但我希望澄清,我懷疑是執行算法的問題。我查了一下他們的郵件列表,這個問題的回覆是無奈的。我稍後會在他們的郵件列表上發佈這個問題。 – 2012-04-24 06:12:35

+1

即使手動拆分表格也不能解決這個問題,在手動拆分表格以適合每個頁面之後,我需要確保前一頁的底部邊距和下一頁的頂部邊距幾乎相同。可以通過追加Spacer來完成。我的項目的一個bitbucket鏈接:https://bitbucket.org/ntj/reportlab_imko_table – 2012-04-24 06:28:57

相關問題