如何用Python的openpyxl库从另一个工作簿复制工作表?
解决openpyxl复制工作表内容到另一工作簿的问题
错误原因
你尝试的wb1[sheet]=wb2写法无效,因为openpyxl的Workbook对象不支持通过__setitem__直接赋值或替换工作表,因此触发AttributeError: __setitem__。
正确解决方案
方法1:仅复制单元格值(简单高效)
如果只需要复制数据内容,无需保留样式、格式,可采用逐行追加的方式:
import openpyxl # 加载wb1并创建新工作表 wb1 = openpyxl.load_workbook(path_full_file) sheet_name = 'current_date' wb1.create_sheet(sheet_name, 0) wb1_sheet = wb1[sheet_name] # 正确加载wb2的工作表 wb2_workbook = openpyxl.load_workbook(path_to) wb2_sheet = wb2_workbook.active # 逐行复制值 for row in wb2_sheet.iter_rows(values_only=True): wb1_sheet.append(row) # 保存修改后的wb1 wb1.save(path_full_file)
方法2:复制值+样式/格式(完整复制)
如果需要保留单元格的字体、填充、对齐方式、数字格式等样式,需遍历每个单元格并复制相关属性,注意导入copy模块复制样式对象(避免引用同一对象导致样式混乱):
import openpyxl from copy import copy # 加载wb1并创建新工作表 wb1 = openpyxl.load_workbook(path_full_file) sheet_name = 'current_date' wb1.create_sheet(sheet_name, 0) wb1_sheet = wb1[sheet_name] # 正确加载wb2的工作表 wb2_workbook = openpyxl.load_workbook(path_to) wb2_sheet = wb2_workbook.active # 遍历所有单元格,复制值和样式 for row in wb2_sheet.iter_rows(values_only=False): for cell in row: # 复制单元格值 wb1_sheet[cell.coordinate].value = cell.value # 复制样式属性 wb1_sheet[cell.coordinate].font = copy(cell.font) wb1_sheet[cell.coordinate].fill = copy(cell.fill) wb1_sheet[cell.coordinate].border = copy(cell.border) wb1_sheet[cell.coordinate].alignment = copy(cell.alignment) wb1_sheet[cell.coordinate].number_format = cell.number_format # 保存修改后的wb1 wb1.save(path_full_file)
注意事项
- 加载工作簿时,若需读取公式计算后的结果而非公式本身,可添加
data_only=True参数,例如openpyxl.load_workbook(path_to, data_only=True)。 - 保存工作簿前确保原文件已关闭,避免权限错误。
内容的提问来源于stack exchange,提问作者Anastasia
相关产品推荐
相关产品推荐

