1、环境搭建:
pyrhon 3.9.7
reportlab 3.6.3
pandas 1.3.4
openpyxl 3.0.9
xlrd 2.0.1
# 安装依赖库
pip install reportlab
pip install pandas
pip install openpyxl
pip install xlrd
2. 实现功能
2.1 读取数据
#读取成绩表
import pandas as pd
# df = pd.read_excel(r'D:\pythonproject\pythonVsc\pandas\成绩表.xls',
# dtype='str',usecols=['xm','bj','语','数','英','物','化','生','综','总'])
df = pd.read_excel(r'D:\202112study\test\13.xlsx',dtype='str')
2.2 制作模板
#制作报表
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.units import cm
#注册字体 字体推荐使用宋体(字形最全面)
pdfmetrics.registerFont(TTFont('fs',r'D:\pythonproject\pythonVsc\pandas\仿宋_GB2312.TTF'))
pdfmetrics.registerFont(TTFont('fz',r'D:\pythonproject\pythonVsc\pandas\FZXBSJW.TTF'))
pdfmetrics.registerFont(TTFont('ht',r'D:\pythonproject\pythonVsc\pandas\FZHTJW.TTF'))
# 模板
# c = canvas.Canvas('test.pdf')
def fg(c):
c.setDash(1,5)
for i in range(3):
y=22.275-7.425*i
c.line(0.5*cm,y*cm,20.5*cm,y*cm)
def one_mb(c,y0=0):
c.setFont('fs',16)
c.drawString(0.5*cm,(28.9+y0)*cm,'姓名: 天道酬勤 厚积薄发')
c.drawString(0.6*cm,(27.4+y0)*cm,'一诊成绩')
c.drawString(0.6*cm,(25.8+y0)*cm,'奋斗格言:')
xk=['语文','数学','英语','物理','化学','生物','总分']
for i in range(7):
cx_xk=3.5+2.5*i
c.drawString(cx_xk*cm,(28.2+y0)*cm,xk[i])
#画表格
c.setLineWidth(0.5)
for i in range(4):
ry=28.8-0.8*i
c.line(0.5*cm,(ry+y0)*cm,20.5*cm,(ry+y0)*cm)
c.line(0.5*cm,(22.5+y0)*cm,20.5*cm,(22.5+y0)*cm)
for i in range(7):
cx=3+2.5*i
c.line(cx*cm,(28.8+y0)*cm,cx*cm,(26.4+y0)*cm)
c.line(0.5*cm,(28.8+y0)*cm,0.5*cm,(22.5+y0)*cm)
c.line(20.5*cm,(28.8+y0)*cm,20.5*cm,(22.5+y0)*cm)
c.line(0.5*cm,(28.8+y0)*cm,3*cm,(28+y0)*cm)
c.setFont('ht',16)
c.drawString(0.6*cm,(26.6+y0)*cm,'二诊目标')
def one_page(c):
for i in range(4):
y0=-7.425*i
one_mb(c,y0)
fg(c)
# one_page(c,df[0])
# c.save()
2.3 写入数据
# 写入数据
c = canvas.Canvas('test.pdf')
def write_one(c,data):
xk = ['xm','语','数','英','物','化','生','总']
zjs=0
for index,row in data.iterrows():
c.setFont('fs',16)
js = zjs%4
y0=-7.425*js
c.drawString(0.5*cm,(28.9+y0)*cm,' '+row[xk[0]])
c.drawString(3.5*cm,(27.4+y0)*cm,row[xk[1]])
c.drawString(6*cm,(27.4+y0)*cm,row[xk[2]])
c.drawString(8.5*cm,(27.4+y0)*cm,row[xk[3]])
c.drawString(11*cm,(27.4+y0)*cm,row[xk[4]])
c.drawString(13.5*cm,(27.4+y0)*cm,row[xk[5]])
c.drawString(16*cm,(27.4+y0)*cm,row[xk[6]])
c.drawString(18.5*cm,(27.4+y0)*cm,row[xk[7]])
zjs=zjs+1
if zjs%4==0:
one_page(c)
c.showPage()
write_one(c,df)
c.save()