You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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_onlywrite_only模式,必须以普通可读写模式加载(默认read_only=False)。


问题2:解决你的代码报错问题

先帮你梳理代码里的几个关键问题:

  1. Workbook初始化错误Workbook('new.xlsx')是错误用法,Workbook类初始化不需要传文件名,创建新工作簿后调用save()时传入文件名即可。
  2. 工作表标题属性错误sheet.Name应改为sheet.title,openpyxl中工作表标题通过title属性访问,而非Name
  3. 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

火山引擎 最新活动