1、完整代码

1.1、打开已有文件

from openpyxl import load_workbook #注意这里需要导入新的模块

# 1. 加载已有工作簿(read_only=False 支持编辑,True 仅读取更高效)
wb = load_workbook("基础写入示例.xlsx", read_only=False)

# 2. 获取工作表(三种方式)
ws = wb["用户信息"]  # 按名称获取
# ws = wb.active  # 获取活动工作表
# ws = wb.worksheets[0]  # 按索引获取(第一个工作表)

# 3. 读取数据(四种方式)
# 方式1:按单元格坐标读取
name = ws["A2"].value  # A2 单元格:小明
age = ws["B2"].value   # B2 单元格:18
print(f"读取单个单元格:{name},{age}岁")

# 方式2:按行列索引读取
gender = ws.cell(row=2, column=3).value  # 第2行第3列:男
print(f"按行列读取:{gender}")

# 方式3:读取整行/整列
row2 = [cell.value for cell in ws[2]]  # 读取第2行所有单元格
colB = [cell.value for cell in ws["B"]]  # 读取B列所有单元格
print(f"整行数据:{row2}")
print(f"整列数据:{colB}")

# 方式4:读取指定范围(如 A1:C4)
range_data = []
for row in ws["A1:C4"]:  # 遍历A1到C4的所有行
    row_values = [cell.value for cell in row]
    range_data.append(row_values)
print(f"指定范围数据:{range_data}")
# 1. 新增工作表
ws_new = wb.create_sheet(title="新增工作表", index=1)  # index=1 插入到第二个位置
ws_new["A1"] = "新增数据"

# 2. 删除工作表
if "Sheet" in wb.sheetnames:  # 先判断是否存在
    wb.remove(wb["Sheet"])

# 3. 插入/删除行/列
ws = wb["用户信息"]
ws.insert_rows(2)  # 在第2行插入空行
ws.insert_cols(3)  # 在第3列插入空列
ws.delete_rows(5)  # 删除第5行
ws.delete_cols(4)  # 删除第4列
#先保存修改
wb.save("基础写入示例_修改版.xlsx")
# 4. 关闭工作簿(避免文件占用)
wb.close()

2、代码详细解读与延伸

逐行代码解读(含函数形参说明)

1. 导入模块

python

from openpyxl import load_workbook #注意这里需要导入新的模块
  • 作用:从 openpyxl 库中导入 load_workbook 函数,该函数是读取 / 编辑已有 Excel 文件的核心入口。
  • 无参数:仅模块导入,无函数调用。

有了前面的基础,这里不是很难理解,需要记住需要先导入openpyxl的一个模块

2. 加载已有工作簿

python

wb = load_workbook("基础写入示例.xlsx", read_only=False)
  • 作用:加载指定路径的 Excel 文件,返回一个 Workbook 对象(后续所有操作的核心载体)。
  • load_workbook 核心形参说明

    表格

    形参名 类型 默认值 作用
    filename str 无(必填) Excel 文件的路径 / 名称(如 "基础写入示例.xlsx")
    read_only bool False - False:支持读写(编辑、插入 / 删除行列等),但内存占用稍高- True:仅读取模式,速度更快、内存占用低,无法编辑
    data_only bool False - False:读取单元格公式本身(如 "=A1+B1")- True:读取公式计算后的结果值
    keep_vba bool False 是否保留 VBA 宏代码(如需操作带宏的 Excel 需设为 True)

另外,我们也知道,这些参数不设置的情况下,默认为False,注意我们读取一些包含很多公式的表格文件时,大多数情况下,我们是需要读取的是计算结果的,这个data_only是需要设置为True的。

注意事项:

  • data_only=True 坑点:如果文件是刚用 openpyxl 生成的,里面的公式还没被 Excel 打开计算过,读出来会是 None,这时候需要手动打开 Excel 保存一次,或者用其他库(如 win32com)触发计算。
  • keep_vba=True 坑点:openpyxl 不能创建新的 VBA 代码,只能保留已有的;如果你想给 Excel 加新宏,得用其他工具。
3. 获取工作表(三种方式)
ws = wb["用户信息"]  # 按名称获取
# ws = wb.active  # 获取活动工作表
# ws = wb.worksheets[0]  # 按索引获取(第一个工作表)
  • 作用:从已加载的工作簿中获取指定的工作表对象(Worksheet),后续对单元格的操作都基于该对象。
  • 三种方式说明
    1. wb["用户信息"]:按工作表名称精准获取(推荐,不易出错),需确保工作表名称存在。
    2. wb.active:获取工作簿中「当前激活」的工作表(打开 Excel 时默认显示的那个)。
    3. wb.worksheets[0]:按索引获取,索引从 0 开始(0 = 第一个工作表,1 = 第二个,以此类推)。
  • 需要注意的点:

当采取以上方法,获取sheet,如果名称不存在或者

4. 读取数据(四种方式)
方式 1:按单元格坐标读取

python

name = ws["A2"].value  # A2 单元格:小明
age = ws["B2"].value   # B2 单元格:18
print(f"读取单个单元格:{name},{age}岁")
  • 作用:通过「列字母 + 行数字」的坐标(如 A2、B2)读取单元格的值。
  • 关键说明
    • ws["A2"]:获取 A2 单元格的 Cell 对象。
    • .valueCell 对象的核心属性,获取 / 设置单元格的实际值(无值时返回 None)。
方式 2:按行列索引读取

python

gender = ws.cell(row=2, column=3).value  # 第2行第3列:男
print(f"按行列读取:{gender}")
  • 作用:通过「行号、列号」(纯数字)读取单元格的值,适合循环遍历场景。
  • ws.cell() 形参说明

    表格

    形参名 类型 默认值 作用
    row int 无(必填) 行号(从 1 开始,不是 0!)
    column int 无(必填) 列号(从 1 开始,1=A 列,2=B 列,以此类推)
    value 任意类型 None 可选,直接设置单元格的值(如 ws.cell(row=2, column=3, value="女")
方式 3:读取整行 / 整列

python

row2 = [cell.value for cell in ws[2]]  # 读取第2行所有单元格
colB = [cell.value for cell in ws["B"]]  # 读取B列所有单元格
print(f"整行数据:{row2}")
print(f"整列数据:{colB}")

这里可以看到,还是比较智能的,当在ws[2]直接键入数字时,就直接表示为行,当是字符时就直接表示为列

  • 作用:批量读取整行 / 整列的所有单元格值,返回列表。
  • 关键说明
    • ws[2]:代表第 2 行的所有单元格(返回 Cell 对象的可迭代对象)。
    • ws["B"]:代表 B 列的所有单元格(同理)。
    • 列表推导式 [cell.value for cell in ...]:遍历所有 Cell 对象,提取 .value 组成纯值列表(否则列表里是 Cell 对象,不是实际数据)。
方式 4:读取指定范围(如 A1:C4)

python

range_data = []
for row in ws["A1:C4"]:  # 遍历A1到C4的所有行
    row_values = [cell.value for cell in row]
    range_data.append(row_values)
print(f"指定范围数据:{range_data}")
  • 作用:读取指定单元格范围(A1 到 C4)的所有数据,返回二维列表(外层列表 = 行,内层列表 = 列)。
  • 关键说明
    • ws["A1:C4"]:代表 A1 到 C4 矩形区域的所有单元格,遍历后先得到「每一行的 Cell 对象列表」。
    • 嵌套遍历:外层循环遍历每一行,内层列表推导式提取该行所有单元格的值,最终 range_data 是 [[A1,B1,C1], [A2,B2,C2], ..., [A4,B4,C4]] 格式。
5. 新增工作表

使用creat_sheet来表示

ws_new = wb.create_sheet(title="新增工作表", index=1)  # index=1 插入到第二个位置
ws_new["A1"] = "新增数据"
  • 作用:在工作簿中创建新的工作表,并给新工作表的 A1 单元格赋值。
  • wb.create_sheet() 形参说明

    表格

    形参名 类型 默认值 作用
    title str "SheetX"(X = 数字,如 Sheet1) 新工作表的名称
    index int None(默认插入到最后) 新工作表的位置索引(从 0 开始,index=1 表示插入到第二个位置)
  • 注意这里的形参title,需符合sheet的命名规则,不能包含*、/、《这类的特殊字符
  • 补充ws_new["A1"] = "新增数据" 是直接给新工作表的 A1 单元格赋值,等价于 ws_new.cell(row=1, column=1, value="新增数据")
6. 删除工作表

python

使用remove方法

if "Sheet" in wb.sheetnames:  # 先判断是否存在
    wb.remove(wb["Sheet"])
  • 作用:删除工作簿中名为 "Sheet" 的工作表(先判断存在性,避免报错)。
  • 关键说明
    • wb.sheetnames:工作簿的属性,返回所有工作表名称的列表(如 ["用户信息", "Sheet"])。
    • wb.remove(工作表对象):删除指定的工作表,参数必须是 Worksheet 对象(而非字符串名称),因此需要 wb["Sheet"] 先获取对象。
    • 判空逻辑:如果直接删除不存在的工作表,会抛出 KeyError,因此先通过 in 判断是必要的。
7. 插入 / 删除行 / 列

python

也就是sheet所具备的方法insert_rows(cols)和delete_rows(cols)

ws = wb["用户信息"]  # 重新定位到"用户信息"工作表
ws.insert_rows(2)  # 在第2行插入空行
ws.insert_cols(3)  # 在第3列插入空列
ws.delete_rows(5)  # 删除第5行
ws.delete_cols(4)  # 删除第4列
  • 作用:对指定工作表进行行 / 列的插入、删除操作(所有操作均从 1 开始计数)。
  • 核心函数说明

    表格

    函数 形参(必填) 作用
    insert_rows(idx) idx:行号 在第 idx上方插入 1 行空行(如需插入多行,加 amount 参数,如 insert_rows(2, amount=3) 插入 3 行)
    insert_cols(idx) idx:列号 在第 idx左侧插入 1 列空列(多行同理加 amount
    delete_rows(idx) idx:行号 删除第 idx 行(删除多行加 amount
    delete_cols(idx) idx:列号 删除第 idx 列(删除多列加 amount
8. 保存并关闭工作簿

python

wb.save("基础写入示例_修改版.xlsx")  # 保存修改
wb.close()  # 关闭工作簿(避免文件占用)
  • 作用:保存所有修改到新文件,并关闭工作簿释放资源。
  • 关键说明
    • wb.save(文件名)
      • 若文件名与原文件相同(如 "基础写入示例.xlsx"),则覆盖原文件;
      • 若文件名不同(如 "_修改版"),则生成新文件,原文件保留。
      • 注意:保存前需确保文件未被 Excel 或其他程序打开,否则会报错。
    • wb.close():关闭工作簿,释放内存和文件句柄,避免文件被程序占用(尤其是只读模式或大文件操作后,必须关闭)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐