夜雨聆风学习资料网

ARTICLE · 1008765

Python语法日报 第12期|Excel自动化开篇——多sheet处理,别一个个点开看表了

Python语法日报 第12期|Excel自动化开篇——多sheet处理,别一个个点开看表了

最近搞一个大项目,差点把这系列给忘了,断更了这么久。今天补上,接着搞多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('搞定,打开看看')

六、今日核心操作

干啥
代码
新建sheet
wb.create_sheet('名字')
删除sheet
wb.remove(wb['名字'])
复制sheet
wb.copy_worksheet(wb['名字'])
遍历所有sheet
for name in wb.sheetnames:
看合并区域
ws.merged_cells.ranges
拆合并
ws.unmerge_cells('A1:C1')

七、下期预告

第13期:批量处理多个Excel文件——文件夹里几十个表,一键合并。到时候把os模块和openpyxl串起来用,真正解放双手。

已更Excel系列:

第9期:库的选择与第一个读写

第10期:行列操作与遍历

第11期:单元格样式与公式

下期见。代码敲一遍,别光看哈。

后台回复 001 ,直接拿Python全套学习资料、办公脚本、实战代码,拿走就能用。

相关学习资料