python—对现有文档的读写和编辑
·
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核心形参说明:表格
形参名 类型 默认值 作用 filenamestr 无(必填) Excel 文件的路径 / 名称(如 "基础写入示例.xlsx") read_onlybool False - False:支持读写(编辑、插入 / 删除行列等),但内存占用稍高-True:仅读取模式,速度更快、内存占用低,无法编辑data_onlybool False - False:读取单元格公式本身(如 "=A1+B1")-True:读取公式计算后的结果值keep_vbabool 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),后续对单元格的操作都基于该对象。 - 三种方式说明:
wb["用户信息"]:按工作表名称精准获取(推荐,不易出错),需确保工作表名称存在。wb.active:获取工作簿中「当前激活」的工作表(打开 Excel 时默认显示的那个)。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对象。.value:Cell对象的核心属性,获取 / 设置单元格的实际值(无值时返回None)。
方式 2:按行列索引读取
python
gender = ws.cell(row=2, column=3).value # 第2行第3列:男
print(f"按行列读取:{gender}")
- 作用:通过「行号、列号」(纯数字)读取单元格的值,适合循环遍历场景。
ws.cell()形参说明:表格
形参名 类型 默认值 作用 rowint 无(必填) 行号(从 1 开始,不是 0!) columnint 无(必填) 列号(从 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()形参说明:表格
形参名 类型 默认值 作用 titlestr "SheetX"(X = 数字,如 Sheet1) 新工作表的名称 indexint 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():关闭工作簿,释放内存和文件句柄,避免文件被程序占用(尤其是只读模式或大文件操作后,必须关闭)。
更多推荐



所有评论(0)