最近学校整理学籍信息,其中有个需求是将一个总表拆分成若干个表格,首先将总表的每个学生的姓名、学号、联系电话信息提取出来,再根据学生的班级信息进行归类,生成若干个班级表。
总表里有8000多条数据,每条数据有41个信息,分类的班级有接近200个,使用人工一段一段复制肯定是太麻烦的,使用Python操作Excel表可以大大提升我们的工作效率。
Python操作Execl表有许多模块,在多方查资料下,我选择使用Python的openpyxl
模块。
这里贴上我学习的网站:https://geek-docs.com/python/python-tutorial/python-openpyxl.html
以及openpyxl
的官方Api文档:https://openpyxl.readthedocs.io/en/stable/
基础学习
在openpyxl中,主要用到三个概念:Workbooks,Sheets,Cells。
- Workbook就是一个excel工作表;
- Sheet是工作表中的一张表页;
- Cell就是简单的一个格。
openpyxl就是围绕着这三个概念进行的,不管读写都是“三板斧”:打开Workbook,定位Sheet,操作Cell。
第一件事就是import openpyxl
,这个就不用多说了吧
Openpyxl 加载Excel表
使用wb = openpyxl.load_workbook(file)
读取已有的Excel文件
接着使用sheetnames = wb.sheetnames
获取所有工作表的名字
1 2 3
| wb = openpyxl.load_workbook(file) sheetnames = wb.sheetnames sheet = wb[sheetnames[0]]
|
Openpyxl 读取单元格
OpenPyXL读取(定位)单元格有两种方法,我用以下表格演示:
1 2 3 4 5 6 7 8 9 10
| import openpyxl /* 省略加载表格部分的代码 */
b2 = sheet['B2'].value print(b2)
c2 = sheet.cell(row=2, column=3).value print(c2)
|
openpyxl还提供了许多方法,可以实现读取多个单元格、按行迭代、按列迭代等等,具体请参考Api文档
Openpyxl 写入单元格
OpenPyXL写入单元格也有两种方法:
1 2 3 4 5 6 7 8 9 10
| import openpyxl /* 省略加载表格部分的代码 */
sheet['B2'] = "hello"
sheet.cell(row=2, column=3).value = "world"
wb.save('write2cell.xlsx')
|
Openpyxl 附加值
使用append()
方法,我们可以在当前工作表的底部附加一组值。
1 2 3 4 5 6 7
| import openpyxl /* 省略加载表格部分的代码 */
rows = ("hello", "world") sheet.append(row)
wb.save('append2cell.xlsx')
|
Openpyxl 保存Excel表
当我们修改完文件后可以使用save('filename')
来保存文件
1 2 3 4 5 6 7 8 9
| import openpyxl
wb = openpyxl.load_workbook(file) sheetnames = wb.sheetnames sheet = wb[sheetnames[0]]
sheet.cell(row=1, column=1).value = "hello world"
wb.save('save2file.xlsx')
|
项目文件结构
先来看一下项目的文件结构:
由于提取出来的数据需要再进行一些文本填充,这里把将要填充的文本另存为一个模板template
,这样直接往模板里存数据就可以了。
项目代码
这里通过判断当前班级的名称与上一个班级的名称是否相同,来区分班级表。若相同则往当前表里写入数据,若不相同则保存当前表、创建新表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| import openpyxl
name_column = 1 stid_column = 13 class_column = 27 phone_column = 31
def loadexcel(filePath): wb = openpyxl.load_workbook(filePath) sheetnames = wb.sheetnames sheet = wb[sheetnames[0]] return wb, sheet
all_wb, all_sheet = loadexcel(u'all.xlsx')
new_wb, new_sheet = loadexcel(u'template.xlsx') tempclass = "" read_row = 3 write_row = 3
while True: name = all_sheet.cell(row=read_row, column=name_column).value stid = all_sheet.cell(row=read_row, column=stid_column).value classname = all_sheet.cell(row=read_row, column=class_column).value phone = all_sheet.cell(row=read_row, column=phone_column).value if read_row == 3: tempclass = all_sheet.cell(row=read_row, column=class_column).value if tempclass == classname: new_sheet.cell(row=write_row, column=1).value = name new_sheet.cell(row=write_row, column=2).value = stid new_sheet.cell(row=write_row, column=3).value = phone read_row += 1 write_row += 1 else: print("=======存储中:" + tempclass + "=======") new_wb.save('result/' + tempclass + '.xlsx') if read_row == 8874: break tempclass = all_sheet.cell(row=read_row, column=class_column).value new_wb, new_sheet = loadexcel(u'template.xlsx') write_row = 3
|