一,從excel表格中提取所有學生姓名,班級,成績數據
二,按要求篩選學生名單,優秀學生選成績前20名,如有并列,也制作獎狀;進步獎學生取進步率前20名,如有并列,也制作獎狀,進步率為:(本周成績-上周成績)/上周成績
三,生成所有做獎狀的學生名單,放入excel表格
四,為符合條件的每位學生制作png形式的獎狀
五,將每個班級的獎狀放到同一個ppt中
獎狀圖片模板以及excel的格式如下圖所示:
請大家多多指教,代碼如下:
// A code block
##### 本版本是ppt版 #####
import datetime
, time
, pptx
import pandas
as pd # 數據處理
from docx
.shared
import RGBColor
from PIL import Image
, ImageDraw
, ImageFont
from pptx
.util
import Inches# 用戶選擇獎狀類型
def
tesSpecies():while True
:info
= input('請選擇您要打印的獎狀種類【1(優秀獎狀);2(進步獎狀)】請輸入‘1’或‘2’:')if info
== '1':info
= '優秀獎狀'breakelif info
== '2':info
= '進步獎狀'breakelse:print('您輸入的格式不正確,請重新輸入')return info# 用戶選擇成績周期week,第幾周的成績數據
def
week():while True
:week
= input('請輸入成績周期(例如:第十一周):')if week is None
:print('您未輸入內容,請重新輸入')else:breakreturn week# 用戶輸入存儲成績數據的excel文件
def
filename():while True
:filename
= input('請輸入存放成績數據的文件名稱(例如:x.xls)')if filename
.endswith('.xls') is False
:print('輸入的文件類型必須是excel表格,請重新輸入')else:breakprint('請稍等,獎狀制作中......')return filename# 優秀獎狀
-從文件中提取所有學生信息,并按總成績排序
def
goodFileName(file
, sheetName
, columnName
, sortColumn
):products
= pd
.read_excel(file
, sheet_name
=sheetName
, usecols
=columnName
) # 數據類型為frame
.DataFrame# 按‘綜合成績’降序排列,取前
20名,tail(n)為取尾n行students
= products
.sort_values(by
=sortColumn
, ascending
=False
)return students# 進步獎狀
-從文件中提取所有學生信息,并按進步率排序
def
progressFileName(file
, sheetName
, columnName
):products
= pd
.read_excel(file
, sheet_name
=sheetName
, usecols
=columnName
)# 增加’進步率‘列,按'進步率‘排列,tail(n)為取尾n行products
['進步率'] = products
.apply(lambda x
: (x
['綜合成績'] - x
['上周課綜合成績']) / x
['上周課綜合成績'], axis
=1)students
= products
.sort_values(by
="進步率", ascending
=False
)return students# student類,屬性:姓名,班級,分數
class student(object
):def
__init__(self
, name
, major
, grade
, score
):self
.name
= name # student的姓名屬性self
.major
= major # student的專業屬性self
.grade
= grade # student的班級屬性self
.score
= score # student的分數屬性# 檢查是否有排名并列的學生,獲得最終獲獎學生名列表
def
isRanking(namelt
, species
):# 將前
20名同學名單放入優秀學生列表goodStu
= namelt
[0:20]# 優秀獎狀人名單
if species
== '優秀獎狀':# 檢查是否有跟第
20名分數相同的同學,如果有也加入到優秀學生列表
for i
in range(20, len(namelt
)):if scorelt
[i
] == scorelt
[19]:goodStu
.append(namelt
[i
])# 進步獎狀人名單
else:for i
in range(20, len(namelt
)):if proRatelt
[i
] == proRatelt
[19]:goodStu
.append(namelt
[i
])return goodStu# 獲得獎狀的學生名單
def
nameList(students
, counter
):goodStudentDetail
= students
.head(counter
)goodStudent
= goodStudentDetail
['學生姓名']# 建立學生名單列表nameList
= []for name
in goodStudent
:nameList
.append(name
)return nameList# 獲優秀獎學生根據班級信息排序后的詳情
def
goodClassInfo(students
, counter
):classInfoList1
= (students
.iloc
[:, [0, 1, 2, 3]]).head(counter
) # 根據排名取前counter名學生信息classInfoList
= classInfoList1
.sort_values(by
=['專業', '班級'], ascending
=[False
, True
]) # 根據班級信息排序
return classInfoList# 獲進步獎學生根據班級信息排序后的詳情
def
progressClassInfos(students
,counter
):classInfoList1
= (students
.iloc
[:, [0, 1, 2, 5]]).head(counter
)classInfoList
= classInfoList1
.sort_values(by
=['專業', '班級'], ascending
=[False
, True
])return classInfoList# 打印開始時間
print(time
.strftime('%I:%M:%S'))
# 用戶選擇獎狀類型
species
= tesSpecies()
# 用戶輸入成績是第幾周的
week
= week()
# 用戶輸入數據來源的文件名
filename
= filename()# 優秀獎狀
if species
== '優秀獎狀':# 從excel文檔中提取優秀學生的數據students
= goodFileName(filename
, f
'{week}-成績詳情', 'A,E,F,K', '綜合成績')
# 進步獎狀
else:# 從excel文檔中提取優秀學生的數據students
= progressFileName(filename
, f
'{week}-成績詳情','A,E,F,K,M')namelt
, majorlt
, gradelt
, scorelt
,proRatelt
= [], [], [], [], []
# 將每位學生的姓名,專業,班級,分數,進步率分別放入對應的列表
for name
in students
.iloc
[:, 0]:namelt
.append(name
)
for major
in students
.iloc
[:, 1]:majorlt
.append(major
)
for grade
in students
.iloc
[:, 2]:gradelt
.append(grade
)
for score
in students
.iloc
[:, 3]:scorelt
.append(score
)
if species
!= '優秀獎狀':for proRate
in students
.iloc
[:,5]: # 進步率proRatelt
.append(proRate
)
# 獲得獲獎學生名單列表
goodStu
= isRanking(namelt
, species
)
# 統計優秀學生總人數
counter
= len(goodStu
)# 調取獲獎學生的名字名單
nameList
= nameList(students
, counter
)
# 調取優秀學生的詳細信息
if species
== '優秀獎狀':classInfoList
= goodClassInfo(students
, counter
)
# 將優秀學生的詳細信息放入excelclassInfoList
.to_excel(f
"{species}學生-詳細名單-{week}.xlsx")else: # 進步classInfoList
= progressClassInfos(students
, counter
)classInfoList
.to_excel(f
"{species}學生-詳細名單-{week}.xlsx")# 當前日期
a
= datetime
.datetime
.now()
today
= f
'{a.year}年{a.month}月{a.day}日'
# 逐一打印獎狀
name
= ''
gradeSet
= set() # 設置一個空的班級名集合,用于收集班級的信息同時去重
pngFileName
= [] # 將所有制作好的獎狀名稱放入這個文件名列表
for num
in range(len(nameList
)):name
= nameList
[num
] # 將name變量附上名字的值,用于類的實例化,并且不會對namelt列表中的值造成影響name
= student(namelt
[num
], majorlt
[num
], gradelt
[num
], scorelt
[num
])# line
= name
.strip('\n') # 去掉列表中每一個元素的換行符
if species
== '優秀獎狀':picture
= '1優秀獎狀模板.png'else:picture
= '1進步獎狀模板.png'old_img
= Image
.open(picture
)draw
= ImageDraw
.Draw(old_img
)# 設置圖片文字,字體類型,
'simkai.ttf'為字體文件路徑,以及字體大小,顏色newFont1
= ImageFont
.truetype('simkai.ttf', 38) # 名字的字體的文件名
/路徑 字體大小newFont2
= ImageFont
.truetype('simhei.ttf', 33) # 日期的字體(字體文件路徑) 大小newColor
= RGBColor(0, 0, 0) # 通過
RGB設置學生名字的顏色# 分別設置文字的字體及位置draw
.text((196, 190), nameList
[num
], font
=newFont1
, fill
=newColor
)draw
.text((660, 570), today
, font
=newFont2
, fill
=newColor
)# 獎狀的名字
.pngsave_address
= str(name
.major
) + '-' + str(name
.grade
) + '-' + nameList
[num
] + f
'-{species}-' + time
.strftime('%Y%m%d') #
+ '.png'old_img
.save(save_address
+ '.png', 'png') # 可以直接將png卸載名字上,此處是方便將文件改成jpg格式的命名,所以分開寫# 將獎狀從png格式改成jpg格式(因為
RGB不能直接寫成jpg)pngName
= save_address
+ '.png'# 也可以制作jpg的圖片,代碼如下:# jpgName
= save_address
+ '.jpg'# 將
RGB轉換# im
= Image
.open(pngName
)# rgbIm
= im
.convert('RGB')# rgbIm
.save(jpgName
)# 將班級信息存入集合中,方便去重gradeSet
.add(f
'{name.major}-{name.grade}')# 將獎狀名稱放入列表pngFileName
.append(pngName
)# 將班級信息轉為列表,方便使用下標操作
gradeList
= []
for grade
in gradeSet
:gradeList
.append(grade
)
# 將同一班級的獎狀放到同一個列表中,再創建班級的ppt文件
for num
in range(len(gradeList
)):gradeName
= gradeList
[num
] # 提取班級名稱grade
= [] # 為這個班級建空列表# 對獎狀分班
for file
in pngFileName
:if gradeList
[num
] in file
:grade
.append(file
)gradeLen
= len(grade
)print(f
'{gradeName}班,共{gradeLen}名學生獲得{species}')# 制作這個班級的
PPT文件ppt_file
= pptx
.Presentation()for fn
in grade
:slide
= ppt_file
.slides
.add_slide(ppt_file
.slide_layouts
[1])slide
.shapes
.add_picture(fn
, Inches(0), Inches(0), Inches(10), Inches(7.5))ppt_file
.save(f
'{gradeName}-{week}-{species}-{today}.ppt')# 統計獎狀數,提示打印結束
print(f
'共打印獎狀{counter}個\n{species}榮譽證書制作完成!')
# 打印結束時間
print(time
.strftime('%I:%M:%S'))
總結
以上是生活随笔為你收集整理的python制作奖状,从excel表格中导出数据,取前20名,做成png奖状,再放入ppt中的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。