2012-02-14 15 views
10

से पीडीएफ आउटपुट में पेज ब्रेक पर तालिका कॉलम शीर्षलेखों को दोहराने के लिए कैसे करें मैं पीडीएफ दस्तावेजों में टेबल लिखने के लिए रिपोर्टलैब का उपयोग कर रहा हूं और परिणामों से बहुत खुश हूं (अभी तक प्रवाहों पर कुल समझ नहीं होने के बावजूद)।रिपोर्ट लेबल

हालांकि, मैं यह समझने में सक्षम नहीं हूं कि एक पृष्ठ ब्रेक कैसे फैलाता है, इसके कॉलम शीर्षलेखों को दोहराया जाता है।

नीचे दिया गया कोड सी: \ Temp में test.pdf बनाता है जिसमें डेटा की 99 पंक्तियों के बाद एक शीर्ष पंक्ति होती है।

शीर्षक पृष्ठ पहले पृष्ठ पर बहुत अच्छा लग रहा है लेकिन मैं इसे दूसरे और तीसरे पृष्ठों के शीर्ष पर दोहराना चाहता हूं।

मैं 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 तर्क प्रमुख पंक्तियों की संख्या कि जब दोहराया जाना चाहिए निर्दिष्ट करता है टेबल को खुद को विभाजित करने के लिए कहा जाता है।

तो जब आप तालिका बनाते हैं, तो यह आपके द्वारा पारित तर्कों में से एक है, और यह पहली एन पंक्तियों को दोहराने वाली शीर्ष पंक्तियों में बदल देगा। आप पृष्ठ 77 पर पाठ के इस हिस्से मिल जाएगा, लेकिन एक तालिका बनाने से संबंधित अनुभाग पेज 76.

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

+0

धन्यवाद गॉर्डन - मुझे मार्गदर्शन पर वापस ओर इशारा करते हुए ने मुझे एक बहुत ही सरल और कामकाजी कोड उदाहरण विकसित करने में सक्षम होने का नेतृत्व किया है जिसे मैं नीचे दिए गए उत्तर के रूप में जोड़ूंगा। – PolyGeo

15

पर शुरू होता है यह कोड मैं विकसित है, repeatRows का उपयोग कर पुनर्विचार करने के लिए गॉर्डन की सलाह मान लेने के बाद , और यह काम करता है!

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

मुझे यह समाधान दो पृष्ठों पर एक तालिका पर आसानी से हेडर दोहराने के लिए मिला। अपनी लाइन के लिए इस सीएसएस में अपने सीएसएस में जोड़ें:

-fs-table-paginate: पेजिनेट;

मैं भी FPDF जो शक्तिशाली लगता है के लिए एक वर्ग मिल गया (मैं पल के लिए इसकी आवश्यकता नहीं है, इसलिए मैं यह परीक्षण नहीं किया था)

http://interpid.eu/fpdf-table

+0

सुझाव के लिए धन्यवाद लेकिन मेरे मामले में मैं सीएसएस का उपयोग नहीं कर रहा हूं - जब तक यह पृष्ठभूमि में नहीं हो रहा है। – PolyGeo

संबंधित मुद्दे