👉 点关注,不迷路 👈⭐️ 第一时间获取更新 ⭐️
一、行和列的基本操作
1. 获取行数和列数
from openpyxl import load_workbookwb = load_workbook("学生成绩表.xlsx")ws = wb.active# 获取最大行数和列数print(f"最大行数:{ws.max_row}")print(f"最大列数:{ws.max_column}")# 获取当前使用的区域范围print(f"使用区域:{ws.dimensions}") # 例如:A1:F6
2. 调整行高和列宽
from openpyxl import Workbookwb = Workbook()ws = wb.active# 设置列宽(单位:字符宽度)ws.column_dimensions['A'].width = 15ws.column_dimensions['B'].width = 20ws.column_dimensions['C'].width = 10# 设置行高(单位:磅)ws.row_dimensions[1].height = 30ws.row_dimensions[2].height = 25# 批量设置多列宽度for col in ['D', 'E', 'F']: ws.column_dimensions[col].width = 12# 批量设置多行高度for row in range(3, 10): ws.row_dimensions[row].height = 18wb.save("行列格式.xlsx")
3. 插入行和列
from openpyxl import Workbookwb = Workbook()ws = wb.active# 写入示例数据for i in range(1, 6): ws.append([f"数据{i}1", f"数据{i}2", f"数据{i}3"])print("原始数据:")for row in ws.iter_rows(values_only=True): print(row)# 在第2行之前插入1行ws.insert_rows(2) # 原来的第2行变成第3行# 在第2行之前插入3行ws.insert_rows(2, amount=3)# 在第2列之前插入1列ws.insert_cols(2)# 在第2列之前插入2列ws.insert_cols(2, amount=2)print("\n插入后:")for row in ws.iter_rows(values_only=True): print(row)wb.save("插入行列.xlsx")
insert_rows / insert_cols 参数说明:
4. 删除行和列
from openpyxl import Workbookwb = Workbook()ws = wb.active# 写入示例数据for i in range(1, 6): ws.append([f"第{i}行", f"数据{i}2", f"数据{i}3"])print("原始数据:")for row in ws.iter_rows(values_only=True): print(row)# 删除第3行ws.delete_rows(3)# 从第2行开始删除2行ws.delete_rows(2, amount=2)# 删除第2列ws.delete_cols(2)# 从第1列开始删除2列ws.delete_cols(1, amount=2)print("\n删除后:")for row in ws.iter_rows(values_only=True): print(row)wb.save("删除行列.xlsx")
注意: 删除行列后,后面的数据会自动前移,公式中的引用也会自动更新。
5. 移动单元格区域
from openpyxl import Workbookwb = Workbook()ws = wb.active# 写入测试数据for row in range(1, 5): for col in range(1, 4): ws.cell(row=row, column=col, value=f"R{row}C{col}")print("移动前:")for row in ws.iter_rows(values_only=True): print(row)# 移动区域 A1:C4 向下移动2行,向右移动1列ws.move_range("A1:C4", rows=2, cols=1)print("\n移动后:")for row in ws.iter_rows(values_only=True): print(row)# 移动时可以指定是否平移公式(translate=True)ws.move_range("D1:F4", rows=1, cols=0, translate=True)wb.save("移动区域.xlsx")
move_range 参数说明:
| |
|---|
cell_range | |
rows | |
cols | |
translate | |
二、工作表管理
1. 工作表的创建与命名
from openpyxl import Workbookwb = Workbook()# 获取默认工作表default_sheet = wb.activeprint(f"默认工作表名称:{default_sheet.title}")# 修改工作表名称default_sheet.title = "首页"# 创建新工作表(默认添加到末尾)sheet1 = wb.create_sheet("数据表")sheet2 = wb.create_sheet("统计表")# 在指定位置创建工作表(0表示最前面)sheet3 = wb.create_sheet("汇总表", 0)print(f"所有工作表:{wb.sheetnames}") # ['汇总表', '首页', '数据表', '统计表']wb.save("创建工作表.xlsx")
2. 选择与切换工作表
from openpyxl import load_workbookwb = load_workbook("创建工作表.xlsx")# 方法1:通过名称获取sheet = wb["数据表"]print(f"当前工作表:{sheet.title}")# 方法2:通过索引获取first_sheet = wb.worksheets[0] # 第一个工作表last_sheet = wb.worksheets[-1] # 最后一个工作表print(f"第一个:{first_sheet.title}")print(f"最后一个:{last_sheet.title}")# 遍历所有工作表for sheet in wb: print(f"正在处理:{sheet.title}")
3. 复制工作表
from openpyxl import Workbookwb = Workbook()ws = wb.activews.title = "原始数据"# 写入一些数据ws["A1"] = "原始内容"ws["A2"] = 100# 复制工作表copied_sheet = wb.copy_worksheet(ws)copied_sheet.title = "副本"# 复制后修改内容copied_sheet["A1"] = "修改后的内容"copied_sheet["B1"] = "新增列"print(f"原始工作表:{ws.title} - A1: {ws['A1'].value}")print(f"复制工作表:{copied_sheet.title} - A1: {copied_sheet['A1'].value}")wb.save("复制工作表.xlsx")
注意:copy_worksheet() 会复制数据、样式、公式,但不会复制图表和图片。
4. 移动工作表顺序
from openpyxl import Workbookwb = Workbook()wb.create_sheet("表A")wb.create_sheet("表B")wb.create_sheet("表C")print(f"移动前:{wb.sheetnames}") # ['Sheet', '表A', '表B', '表C']# 方法1:移动到指定位置sheet = wb["表B"]sheet.move_sheet(offset=-2) # 向前移动2位print(f"移动后:{wb.sheetnames}")# 方法2:重新排序(直接修改 sheetnames 顺序不推荐)# 更可靠的方式:手动调整sheets = wb.worksheetswb._sheets = [sheets[2], sheets[0], sheets[1]] # 重新排序print(f"重排后:{wb.sheetnames}")wb.save("移动工作表.xlsx")
5. 删除工作表
from openpyxl import load_workbookwb = load_workbook("创建工作表.xlsx")print(f"删除前:{wb.sheetnames}")# 方法1:通过名称删除sheet_to_remove = wb["统计表"]wb.remove(sheet_to_remove)# 方法2:直接删除(推荐)del wb["数据表"]# 方法3:通过索引删除wb.remove(wb.worksheets[0])print(f"删除后:{wb.sheetnames}")wb.save("删除工作表.xlsx")
6. 工作表标签颜色
from openpyxl import Workbookfrom openpyxl.styles import PatternFillwb = Workbook()ws1 = wb.activews1.title = "已完成"# 设置工作表标签颜色ws1.sheet_properties.tabColor = "00FF00" # 绿色ws2 = wb.create_sheet("进行中")ws2.sheet_properties.tabColor = "FF9900" # 橙色ws3 = wb.create_sheet("未开始")ws3.sheet_properties.tabColor = "FF0000" # 红色# 颜色可以使用 RGB 十六进制值# 常见颜色:"FF0000"(红), "00FF00"(绿), "0000FF"(蓝), "FFFF00"(黄)wb.save("工作表标签颜色.xlsx")
三、实战案例:合并多个月份的销售报表
from openpyxl import Workbook, load_workbookimport random# ========== 1. 创建三个月的销售数据文件 ==========def create_monthly_report(month_name): """创建单月销售报表""" wb = Workbook() ws = wb.active ws.title = f"{month_name}销售" # 表头 ws.append(["日期", "产品名称", "销量", "单价", "销售额"]) # 模拟数据 products = ["鼠标", "键盘", "U盘", "移动硬盘"] for day in range(1, 11): # 每月10天数据 for product in products: quantity = random.randint(5, 50) price = {"鼠标": 49, "键盘": 129, "U盘": 59, "移动硬盘": 499}[product] sales = quantity * price ws.append([f"{month_name}月{day}日", product, quantity, price, sales]) wb.save(f"{month_name}月销售.xlsx") print(f"{month_name}月销售文件已创建")# 创建3个月的数据for month in [1, 2, 3]: create_monthly_report(month)# ========== 2. 合并三个月的报表 ==========print("\n开始合并报表...")# 创建合并后的工作簿merged_wb = Workbook()# 方法1:每个月份单独一个工作表for month in [1, 2, 3]: source_wb = load_workbook(f"{month}月销售.xlsx") source_ws = source_wb.active # 创建新工作表 target_ws = merged_wb.create_sheet(f"{month}月") # 复制数据 for row in source_ws.iter_rows(values_only=True): target_ws.append(row) print(f"已合并{month}月数据,共{target_ws.max_row - 1}行数据")# 删除默认的空工作表merged_wb.remove(merged_wb["Sheet"])# 方法2:创建汇总工作表(所有数据合并到一起)summary_ws = merged_wb.create_sheet("全年汇总", 0)summary_ws.append(["月份", "日期", "产品名称", "销量", "单价", "销售额"])for month in [1, 2, 3]: source_wb = load_workbook(f"{month}月销售.xlsx") source_ws = source_wb.active # 跳过表头,从第2行开始读取 for row in source_ws.iter_rows(min_row=2, values_only=True): summary_ws.append([f"{month}月"] + list(row))print(f"\n全年汇总共{summary_ws.max_row - 1}行数据")# ========== 3. 添加统计分析 ==========# 计算总销售额total_sales = 0for row in summary_ws.iter_rows(min_row=2, min_col=6, max_col=6, values_only=True): if row[0] is not None: total_sales += row[0]summary_ws.append(["", "", "", "", "总销售额", total_sales])summary_ws.append(["", "", "", "", "数据行数", summary_ws.max_row - 2])# 设置列宽for col in ['A', 'B', 'C', 'D', 'E', 'F']: summary_ws.column_dimensions[col].width = 12merged_wb.save("合并销售报表.xlsx")print("\n报表合并完成!生成文件:合并销售报表.xlsx")# ========== 4. 打印统计信息 ==========print("\n=== 统计信息 ===")for month in [1, 2, 3]: source_wb = load_workbook(f"{month}月销售.xlsx") source_ws = source_wb.active row_count = source_ws.max_row - 1 print(f"{month}月:{row_count}条销售记录")
四、实战练习:员工信息表管理
任务描述:
创建一个员工信息表,包含以下列:
完成以下操作:
在第1行之前插入表头行,设置表头行高为30
在第2行之后插入3行(用于添加新员工)
删除所有状态为"离职"的员工行
设置A列宽度15,B列宽度10,C列宽度12
将整个表格移动到从B2开始的位置
创建两个工作表副本:"在职员工"和"离职员工"
参考答案框架:
from openpyxl import Workbookwb = Workbook()ws = wb.activews.title = "员工总表"# 原始数据(包含离职员工)employees = [ ["E001", "张三", "技术部", "工程师", "2023-01-01", "在职"], ["E002", "李四", "市场部", "专员", "2023-02-01", "离职"], ["E003", "王五", "技术部", "经理", "2022-06-01", "在职"], ["E004", "赵六", "销售部", "主管", "2023-03-01", "离职"], ["E005", "小明", "技术部", "工程师", "2023-04-01", "在职"],]# 1. 写入原始数据for emp in employees: ws.append(emp)# 2. 在开头插入表头行ws.insert_rows(1)ws["A1"] = "工号"ws["B1"] = "姓名"ws["C1"] = "部门"ws["D1"] = "职位"ws["E1"] = "入职日期"ws["F1"] = "状态"# 3. 设置格式ws.row_dimensions[1].height = 30ws.column_dimensions['A'].width = 15ws.column_dimensions['B'].width = 10ws.column_dimensions['C'].width = 12# 4. 删除离职员工(从后往前删,避免索引错乱)for row in range(ws.max_row, 1, -1): if ws.cell(row=row, column=6).value == "离职": ws.delete_rows(row)# 5. 移动整个表格区域ws.move_range(f"A1:F{ws.max_row}", rows=0, cols=1) # 向右移动1列到B2开始# 6. 创建在职员工工作表active_ws = wb.copy_worksheet(ws)active_ws.title = "在职员工"# 7. 创建离职员工工作表(需要重新读取原始数据...)wb.save("员工管理.xlsx")print("员工信息表处理完成")
五、常见错误与解决方法
| | |
|---|
ValueError: Row or column values must be at least 1 | | |
AttributeError: 'Worksheet' object has no attribute 'insert_rows' | | pip install --upgrade openpyxl |
| | |
copy_worksheet | | |
move_range | | |
删除行时的正确做法:
# ❌ 错误:从上往下删for row in range(2, ws.max_row + 1): if condition: ws.delete_rows(row) # 删除后行号变化,会漏删# ✅ 正确:从下往上删for row in range(ws.max_row, 1, -1): if condition: ws.delete_rows(row)
六、核心知识点速查表
| |
|---|
| ws.column_dimensions['A'].width = 15 |
| ws.row_dimensions[1].height = 30 |
| ws.insert_rows(2, amount=1) |
| ws.insert_cols(2, amount=1) |
| ws.delete_rows(2, amount=1) |
| ws.delete_cols(2, amount=1) |
| ws.move_range("A1:C4", rows=2, cols=1) |
| wb.create_sheet("表名") |
| wb.copy_worksheet(ws) |
| wb.remove(ws) |
| wb.sheetnames |
| ws.sheet_properties.tabColor = "FF0000" |
七、实战自我小测验
作业:季度报表合并系统
要求:
创建4个季度的销售数据文件(Q1、Q2、Q3、Q4)
每个文件包含3个月的数据
数据列:月份、产品、销量、单价、销售额
创建一个「年度汇总」工作簿,包含:
4个独立的季度工作表
1个「全年汇总」工作表(合并所有数据)
1个「统计报告」工作表(自动统计)
在统计报告工作表中计算:
全年总销售额
每个季度的总销售额
销量最高的产品
销售额最高的月份
格式要求:
表头行高25,加粗
数字列右对齐
金额列设置千分位格式(可留待第5课数字格式实现)
扩展挑战:
如果您觉得有用,欢迎点赞👍、转发🔄、收藏⭐和评论💬,也烦请分享给您身边有需要的朋友。