2014-10-05 6 views
1

Я использую пакет ReportLab для python для создания таблицы в файле PDF, но таблица слишком широка для страницы, а первая и последняя колонки отключены. Вот пример кода, который я использую.Python ReportLab - таблица слишком широкая для страницы

t = Table(data, style=[("INNERGRID", (0,0), (-1,-1), 0.25, colors.black),("BOX", (0,0), (-1,-1), 0.25, colors.black)]) 

Я пробовал использовать splitbyRow и аналогичные параметры, но ни один из них не работает. Как я могу легко сделать таблицу подходящей для страницы?

ответ

0

вы могли бы добавить еще один параметр на TableData называется colWidths = [250,250] ... вот фрагмент моего кода, где я установить ширину и несколько стилей, а также:

DetailedWorkData = [["Detailed Work Information",""], 
        ["Procedure: XXXXX", "Planned by: XXXXXX"]] 
b = Table(DetailedWorkData, colWidths=[285,285]) 
b.hAlign = "LEFT" 
b.setStyle(TableStyle([ 
         ('BACKGROUND',(0,0),(-1,0),HexColor("#C0C0C0")), 
         ('GRID',(0,1),(-1,-1),0.01*inch,(0,0,0,)), 
         ('FONT', (0,0), (-1,0), 'Helvetica-Bold')])) 
Story.append(b) 

Если посмотреть на 3-я строка у меня есть colWidths, где я указываю, насколько широко я хочу, чтобы столбцы были тогда, я установил стиль пару строк позже.

1

вы можете получить ширину страницы, используя рамку этой страницы. Когда вы используете colWidths ключевого слово, вы должны знать, сколько места у вас есть в наличие:

table = ar.Table(data, colWidths=columnWidths)#there is also rowHeights= 
table.setStyle(tableStyle) 

Как видно из таблицы рисует себя в сборке, вы должны настроить таблицу так, что он использует доступную ширину фрейма будет нарисован.

Эти colWidth могут быть рассчитаны так, чтобы они использовали доступное пространство. Чтобы показать это, я должен был бы использовать расширенный пример, я буду стараться без:

Сначала вы должны определить свой собственный класс документа, который наследуется от BaseDocTemplate:

class MyDocTemplate(BaseDocTemplate): 
    def __init__(self, filename): 
     BaseDocTemplate.__init__(self, filename) 
           #there are more keyword 
           #arguments you can pass 
           #pagesize=A4, 
           #leftMargin=leftMargin, 
           #rightMargin=rightMargin, 
           #topMargin=topMargin, 
           #bottomMargin=bottomMargin, 
           #title=title, 
           #author=author, 
           #subject=subject, 
           #creator=creator)    

затем, если вы создаете документ :

doc = MyDocTemplate(fileName) 

вы можете получить ширину кадра с помощью собственной функции, определенной внутри вашего класса документа:

frame = doc.getFrame('FirstL') 
width = frame._aW 

эта функция может выглядеть следующим образом:

def getFrame(self,framename,orientation="Portrait"): 
    """ 
    returns frame 
    frame._x1,frame._y1 
    frame._width,frame._height 
    frame._leftPadding,frame._bottomPadding 
    frame._rightPadding,frame._topPadding 
    """ 

    f = attrgetter("id") 
    frame = None 

    for temp in self.pageTemplates[::-1]: 
     if f(temp) == framename: 
      #print(temp.id) 
      for frame in temp.frames: 
       print(frame.id) 
       if f(frame) == orientation: 

        return frame 

ReportLab является довольно сложным, я попытался объяснить, не давая подробное объяснение того, как зарегистрировать шаблоны страниц в виде списка на классе документа

pageTemplates список вы можете добавить шаблоны страниц для:

templates.append(PageTemplate(id='FirstL',frames=frameL,onPage=onFirstPage,pagesize=pagesize)) 

onFirstPage является функцией, которая использует следующую схему:

def drawFirstPage(canv,doc): 
    """ 
    This is the Title Page Template (Portrait Oriented) 
    """ 
    canv.saveState() 
    #set Page Size or do some other things on the canvas 
    frame = doc.getFrame('FirstP') 

    canv.setPageSize(frame.pagesize) 
    canv.setFont(_baseFontName,doc.fontSize) 

    canv.restoreState() 

При добавлении шаблонов страниц, как это, предлагаемая функция должна работать:

doc.addPageTemplates(templates) 
Смежные вопросы