ARTICLE · 1008765
Python语法日报 第12期|Excel自动化开篇——多sheet处理,别一个个点开看表了
Python语法日报 第12期|Excel自动化开篇——多sheet处理,别一个个点开看表了
后台回复 001 ,直接拿Python全套学习资料、办公脚本、实战代码,拿走就能用。
最近搞一个大项目,差点把这系列给忘了,断更了这么久。今天补上,接着搞多sheet,以后一个文件里再多的表,也能一键汇总。
一、新建和删除sheet
from openpyxl import load_workbookwb = load_workbook('花名册.xlsx')# 新建一个sheet,名字叫“汇总”ws_new = wb.create_sheet('汇总')# 删除一个sheet,比如删掉叫“Sheet2”的if'Sheet2'in wb.sheetnames: wb.remove(wb['Sheet2'])# 保存wb.save('花名册_多sheet.xlsx')wb.sheetnames 是所有sheet名字的列表,用来判断存不存在。二、复制sheet(同一个文件里)
# 把“Sheet1”复制一份,放到最后,名字叫“Sheet1_副本”wb.copy_worksheet(wb['Sheet1'])# 但默认名字是“Sheet1 Copy”,可以改ws_copy = wb.worksheets[-1]ws_copy.title = '销售部备份'copy_worksheet 只能在同一工作簿里复制,跨文件得手动读写数据。
三、遍历所有sheet,汇总数据
假设每个部门的sheet结构一样:A列姓名,B列工资。现在要搞个总表。
wb = load_workbook('部门工资.xlsx')ws_total = wb.create_sheet('总表')ws_total.append(['部门', '姓名', '工资'])for sheet_name in wb.sheetnames:if sheet_name == '总表':continue# 跳过自己 ws = wb[sheet_name]for row in ws.iter_rows(min_row=2, values_only=True): name, salary = row ws_total.append([sheet_name, name, salary])wb.save('部门工资_汇总.xlsx')iter_rows 跳过表头,每行数据加上sheet名,堆到总表里。
四、合并单元格的坑
合并单元格,就是几个格子拼成一个。麻烦在于:只有左上角那个格子有值,其他格子读出来是空。
读取合并单元格的值:
ws = wb['Sheet1']# 查看合并区域for merged_range in ws.merged_cells.ranges:print(merged_range) # 比如 A1:C1# 取左上角的值 top_left = ws.cell(merged_range.min_row, merged_range.min_col).valueprint(top_left)拆分合并单元格:
ws.unmerge_cells('A1:C1') # 拆掉A1到C1的合并拆完后,原来没值的格子还是空,得手动填。
五、实战:汇总多个sheet,处理合并单元格
场景:每个sheet第一行是合并的标题,第二行才是表头,数据从第三行开始。
wb = load_workbook('部门数据.xlsx')ws_total = wb.create_sheet('汇总')ws_total.append(['部门', '姓名', '工资'])for sheet_name in wb.sheetnames:if sheet_name == '汇总':continue ws = wb[sheet_name]# 跳过第一行(合并标题),从第三行开始for row in ws.iter_rows(min_row=3, values_only=True): name, salary = row ws_total.append([sheet_name, name, salary])# 把汇总表的表头加粗from openpyxl.styles import Fontfor cell in ws_total[1]: cell.font = Font(bold=True)wb.save('部门数据_汇总.xlsx')print('搞定,打开看看')六、今日核心操作
七、下期预告
第13期:批量处理多个Excel文件——文件夹里几十个表,一键合并。到时候把os模块和openpyxl串起来用,真正解放双手。
已更Excel系列:
下期见。代码敲一遍,别光看哈。