Openpyxl技术问题:跨工作表迁移指定行范围数据报错求助
解决
ValueError: Cells cannot be copied from other worksheets问题 这个错误的核心原因很明确:你不能直接把来自一个工作表的单元格/列对象复制到另一个工作表——openpyxl里每个单元格对象都绑定到它所属的工作表,跨表操作单元格对象会触发这个报错。另外你的代码还存在循环逻辑的问题,没有按照需求把指定行范围对应到特定的目标工作表。
问题拆解
你的原始代码有两个关键问题:
- 跨表操作单元格对象:直接将
ws(sheet0)的col或cell对象通过z.append(col)添加到其他工作表,这违反了openpyxl的对象绑定规则。 - 循环逻辑错误:你的代码会把每个行范围的数据追加到所有目标工作表里,而不是第一个范围到sheet1、第二个到sheet2、第三个到sheet3的对应关系。
修正后的实现方案
我们需要先建立行范围和目标工作表的一一对应,然后提取源单元格的值(而非单元格对象)写入目标工作表:
# 假设你已经通过openpyxl加载了工作簿,比如: # from openpyxl import load_workbook # wb = load_workbook("your_file.xlsx") # 定义源工作表和目标工作表列表(顺序要和行范围对应) source_ws = wb.worksheets[0] # sheet0,数据源 target_sheets = wb.worksheets[1:] # sheet1、sheet2、sheet3,按顺序对应三个行范围 # 定义行范围列表,每个元组对应(start_row, end_row) row_ranges = [(1, 34), (34, 52), (52, 75)] # 遍历每个行范围和对应的目标工作表 for (start_row, end_row), target_ws in zip(row_ranges, target_sheets): # 遍历源工作表的指定行(按行遍历更符合append的逻辑) for row in source_ws.iter_rows(min_row=start_row, max_row=end_row, min_col=1, max_col=source_ws.max_column): # 提取当前行所有单元格的值 row_values = [cell.value for cell in row] # 将值追加到目标工作表的末尾 target_ws.append(row_values) # 记得保存工作簿 wb.save("updated_file.xlsx")
额外说明
如果需要复制单元格的样式(比如字体、颜色、边框等),上面的代码只复制了值,你需要额外处理样式:
for (start_row, end_row), target_ws in zip(row_ranges, target_sheets): # 获取目标工作表的起始行(追加到现有内容之后) target_start_row = target_ws.max_row + 1 if target_ws.max_row > 0 else 1 for row_idx, row in enumerate(source_ws.iter_rows(min_row=start_row, max_row=end_row, min_col=1, max_col=source_ws.max_column), start=target_start_row): for col_idx, cell in enumerate(row, start=1): # 写入值 target_ws.cell(row=row_idx, column=col_idx).value = cell.value # 复制样式 target_ws.cell(row=row_idx, column=col_idx).font = cell.font target_ws.cell(row=row_idx, column=col_idx).fill = cell.fill # 可以根据需要添加更多样式属性
内容的提问来源于stack exchange,提问作者Raccoon_17
相关产品推荐
相关产品推荐

