使用openpyxl跨工作簿添加工作表及批量合并Excel首表报错解决
问题1:将现有工作簿的工作表添加到另一个现有工作簿
要实现这个需求,你需要通过复制工作表的方式来完成(openpyxl不支持直接移动工作表,若需要移动可在复制后删除原工作表),具体步骤如下:
先加载源工作簿和目标工作簿:
from openpyxl import load_workbook # 加载包含待复制工作表的源工作簿 source_wb = load_workbook("source.xlsx") # 加载需要添加工作表的目标工作簿 target_wb = load_workbook("target.xlsx")选择要复制的工作表,用
copy_worksheet()方法复制到目标工作簿:# 选取源工作簿中的目标工作表(示例为第一个工作表) source_sheet = source_wb[source_wb.sheetnames[0]] # 复制工作表到目标工作簿,返回复制后的工作表对象 copied_sheet = target_wb.copy_worksheet(source_sheet) # 可选:修改复制后工作表的标题 copied_sheet.title = "自定义工作表名称"最后保存目标工作簿:
target_wb.save("target.xlsx")
注意:复制工作表时,源工作簿不能处于read_only或write_only模式,必须以普通可读写模式加载(默认read_only=False)。
问题2:解决你的代码报错问题
先帮你梳理代码里的几个关键问题:
- Workbook初始化错误:
Workbook('new.xlsx')是错误用法,Workbook类初始化不需要传文件名,创建新工作簿后调用save()时传入文件名即可。 - 工作表标题属性错误:
sheet.Name应改为sheet.title,openpyxl中工作表标题通过title属性访问,而非Name。 - copy_worksheet报错原因:即使设置了
read_only=False,也要确保源工作簿确实以可读写模式加载,同时目标工作簿处于正常可写状态;另外新创建的Workbook默认会生成一个空白Sheet,若不需要可删除。
以下是修正后的完整代码:
from openpyxl import Workbook, load_workbook # 创建新工作簿(无需传入文件名) wb = Workbook() # 删除默认的空白工作表(按需选择) default_sheet = wb["Sheet"] wb.remove(default_sheet) file_list = ["file1.xlsx", "file2.xlsx"] # 替换为你的文件路径列表 tab_names_list = ["表1", "表2"] # 替换为你的工作表名称列表 for i in range(len(file_list)): # 以可读写模式加载源工作簿(read_only=False为默认值,明确写出更清晰) excel = load_workbook(file_list[i], read_only=False, data_only=False) # 获取源文件的第一个工作表 sheet = excel[excel.sheetnames[0]] # 修改工作表标题 sheet.title = tab_names_list[i] # 复制工作表到新工作簿 wb.copy_worksheet(sheet) # 关闭源工作簿,避免占用系统资源 excel.close() # 保存新工作簿 wb.save("new.xlsx")
关键修改说明:
- 调整了
Workbook的初始化方式,改为save()时传入文件名 - 将
sheet.Name修正为符合openpyxl规范的sheet.title - 添加了
excel.close()操作,避免源文件被长期占用 - 可选删除默认空白工作表,让新文件只包含你需要的内容
这样修改后,就能解决ValueError: Cannot copy worksheets in read-only or write-only mode的报错,因为源工作簿以可读写模式加载,目标工作簿也处于正常可写状态。
内容的提问来源于stack exchange,提问作者Charalamm




