您的位置:首页 > 编程语言 > Python开发

python与reportlab类库技术用例-pdf报表1

2010-03-22 12:03 363 查看
#coding=utf-8
from reportlab.platypus import *
from reportlab.lib.styles import *
from reportlab.rl_config import *
from reportlab.lib.units import *
from reportlab.lib import pagesizes,colors
from reportlab.pdfbase import ttfonts,pdfmetrics
import copy
FONT_PATH=('D:/python_workspace/python_pdf_demo/MSYH.TTF',)
class ReportConfig:
#字体初始化
def init_stylesheet(self):
warnOnMissingFontGlyphs = 0
pdfmetrics.registerFont(ttfonts.TTFont('wenquan',FONT_PATH[0]))
stylesheet= getSampleStyleSheet()
return stylesheet
#初始化普通内容字体样式
def init_body_font(self,stylesheet):
body_style=copy.deepcopy(stylesheet["BodyText"])
body_style.fontName="wenquan"
body_style.fontSzie=12
return body_style
def getSplitStr(self,type):
if(type==1):
return "/n"
else:
return "<br/>"
def getSplitParagraph(self,content,width=0,styles=None):
if(width is None or width<=0):
return Paragraph(content,styles)
param=Paragraph(content,styles)
res=None
try:
res=param.breakLinesCJK(width)
except:
res=param.breakLines(width)
lsttmp=[]
for row in res.lines:
lsttmp.append(row[1][0])
#定义换行符
splitstr=self.getSplitStr(2)
tmpstr=splitstr.join(lsttmp)
return Paragraph(tmpstr,styles)
def firstPages(canvas,doc):
TITLE=u"订单信息列表"
canvas.saveState()
canvas.setFont('wenquan',18)
canvas.drawImage("logo.jpg",20,doc.pagesize[1]-35,33,30,[254,255, 254,255, 254,255])
canvas.drawCentredString(doc.pagesize[0]/2-30,doc.pagesize[1]-30,TITLE)
canvas.setFont('wenquan',8)
canvas.drawString((doc.pagesize[0]/2)-20,20,u"第1页")
canvas.restoreState()
def laterPages(canvas,doc):
TITLE=u"订单信息列表"
canvas.saveState()
canvas.setFont('wenquan',18)
canvas.drawImage("logo.jpg",20,doc.pagesize[1]-35,33,30,[254,255, 254,255, 254,255])
canvas.drawCentredString(doc.pagesize[0]/2-30,doc.pagesize[1]-30,TITLE)
canvas.setFont('wenquan',8)
canvas.drawString((doc.pagesize[0]/2)-20,20,u"第%d页" % (doc.page))
canvas.restoreState()
def init_table_data(config,widths,styles):
import MySQLdb
hosts='192.168.1.32'
users='root'
passwds='12345'
dbs='sjpoto'
charsets='utf8'
conn=MySQLdb.connect(host=hosts,user=users,passwd=passwds,db=dbs,charset=charsets)
cursor=conn.cursor()
cursor.execute("SELECT PRD_ID,PRD_CODE,PRD_LOCALNAME,PRD_MARKET_PRICE,PRD_COLOR FROM BPRODUCT")
lst=[]
for row in cursor.fetchall():
lines=[]
i=0
for field in row:
if(field is not None):
lines.append(config.getSplitParagraph(unicode(field),widths[i],styles))
else:
lines.append("")
i=i+1
lst.append(lines)
cursor.close()
conn.close()
return lst
def init_content():
doc=SimpleDocTemplate("demo5.pdf",pagesize=pagesizes.A4)
#doc.rotation=180
config=ReportConfig()
elements=[]
stylesheet=config.init_stylesheet()
content_style=config.init_body_font(stylesheet)
#p=config.getSplitParagraph(u"测试werqwerwe细3421341234234234心你",20,content_style)
#elements.append(p)
#将页面总宽度分成1000份,取其中1份
pwidth=(doc.pagesize[0]-20)/1000
#表格每列宽度,总共5列
colwidths = (pwidth*50,pwidth*200,pwidth*400,pwidth*200,pwidth*150)
table_data=init_table_data(config,colwidths,content_style)
table1=Table(table_data,colwidths)
table1.setStyle(TableStyle([('GRID',(0,0),(4,len(table_data)),0.25,colors.black)]))
elements.append(table1)
#强制分页
#elements.append(PageBreak())
#再添加一个table
data2=[["aaaa","bbbbbbbbbbbb","cccccccccccccc","ddddddddddddd"],]
colwidths = (pwidth*250,pwidth*250,pwidth*250,pwidth*250)
table2=Table(data2,colwidths)
table2.setStyle(TableStyle([('GRID',(0,0),(4,len(data2)),0.25,colors.black)]))
elements.append(table2)
#生称报表最终内容
#doc.build(elements,onFirstPage=firstPages)
doc.build(elements,onFirstPage=firstPages, onLaterPages=laterPages)
if __name__=="__main__":
init_content()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: