使用Python开发微软的Excel通常需要使用第三方库,如xlrd、xlwt、xlutils、xlwings、win32com、openpyxl、pandas等,各种第三方库都有自己独特的功能和缺陷,因此在采用这些第三方库之前需要慎重考虑。
如:xlrd只能读取在Excel文件中的数据;xlwt只能在Excel文件中写入数据;xlutils虽然可以读写Excel文件的数据,但是它依赖于xlrd和xlwt;xlwings可以从Excel中调用Python,也可在Python中调用Excel;win32com可以独立读写Excel文件的数据;openpyxl也可以独立读写Excel文件的数据;pandas能够读写在Excel文件中的数据,但是它需要xlrd/xlwt/openpyxl/xlsxwriter等库的配合。
下面介绍的Excel实例采用openpyxl库实现了将一个Excel文件的工作簿内容根据规则拆分到多个Excel文件的工作簿中,此实例的编写环境为PyCharm 2019.3.5 x64和Python 3.8。
此实例主要通过使用Python语言的字典来实现根据特定的分类原则将一个工作簿(的工作表数据)拆分成多个工作簿(的工作表数据)。当运行此实例的Python代码(A309.py文件)之后,将根据录取院校把“录取表.xlsx”文件的录取表数据拆分到到各个录取院校工作簿(各个Excel文件)中,效果分别如图1和图2所示。
#导入openpyxl库
import openpyxl
#读取“录取表.xlsx”文件
myBook=openpyxl.load_workbook('录取表.xlsx')
mySheet=myBook['录取表']
#按行获取录取表(mySheet)的单元格数据(myRange)
myRange=list(mySheet.values)
#创建空白字典(myDict)
myDict={}
#从录取表(myRange)的第4行开始循环(到最后一行)
for myRow in myRange[3:]:
#如果在字典(myDict)中存在某录取院校(myRow[0]),
#则直接在某录取院校(myRow[0])中添加考生([myRow])
if myRow[0] in myDict.keys():
myDict[myRow[0]]+=[myRow]
#否则创建新录取院校
else:
myDict[myRow[0]]=[myRow]
#循环字典(myDict)的成员
for myKey,myValue in myDict.items():
#创建新工作簿(myNewBook)
myNewBook=openpyxl.Workbook()
myNewSheet=myNewBook.active
#在新工作表(myNewSheet)中添加表头(录取院校、专业、考生姓名、总分)
myNewSheet.append(myRange[2])
#在新工作表(myNewSheet)中添加键名(录取院校)下的多个键值(考生)
for myRow in myValue:
myNewSheet.append(myRow)
myNewSheet.title=myKey+'录取表'
#保存拆分之后(各个录取院校)的工作簿(myNewBook),或者说保存各个Excel文件
myPath='结果表-'+myKey+'录取表.xlsx'
myNewBook.save(myPath)
3 代码说明
上面这段代码在A309\A309.py文件中。在这段代码中,字典(myDict)的作用就是以“录取院校”作为键名,在该键名下添加键值(即添加录取院校录取的多个考生),从而实现对所有考生进行归类。在此案例中,当字典(myDict)添加了考生以后,其保存的考生内容如下:
{'北京大学': [('北京大学','材料化学','李洪',738),('北京大学','材料化学','常金龙',718),('北京大学','材料化学','李科技',712), ('北京大学','金融学','段成全', 722)],'清华大学': [('清华大学','环境工程','易来江',727),('清华大学','车辆工程','张振中',740),('清华大学','车辆工程','田彬',732),('清华大学','软件工程','陈吉文',718)],'浙江大学': [('浙江大学','生物医学','刘康华',695),('浙江大学','机械工程','辛国明',699),('浙江大学','机械工程','李建平',696),('浙江大学','生物医学', '黄明会',703),('浙江大学','生物医学','张华康',692)],'武汉大学':[('武汉大学','口腔医学','杜建国',701),('武汉大学','口腔医学','何友大',692),('武汉大学','城乡规划学','万冬',701)]}
在创建多个工作簿时,则根据键名(录取院校)在每个工作簿的活动工作表中直接添加该键名(录取院校)的所有键值(即录取院校录取的多个考生),最后将每个工作簿保存为Excel文件。在此案例中,myDict[myRow[0]]=[myRow]也可以写成myDict.update({myRow[0]: [myRow]})。