如何用Python循环遍历Excel工作表复制指定单元格范围至目标工作簿
解决方案
要实现遍历所有对应工作表并完成指定范围数据复制,只需基于现有代码做以下调整:
核心思路
由于两个工作簿的工作表完全相同且顺序一致,可以通过zip()函数将源工作簿和目标工作簿的工作表一一配对,然后循环处理每一对工作表,复用你已验证的copyRange和pasteRange函数完成数据复制。
修改后的完整代码
import openpyxl # 加载源工作簿和目标工作簿 source_wb = openpyxl.load_workbook(r'C:\Users\source.xlsx') dest_wb = openpyxl.load_workbook(r'C:\Users\destination.xlsx') # 复制指定范围数据的函数(保留原有逻辑) def copyRange(startCol, startRow, endCol, endRow, sheet): rangeSelected = [] for i in range(startRow, endRow + 1): rowSelected = [] for j in range(startCol, endCol + 1): rowSelected.append(sheet.cell(row=i, column=j).value) rangeSelected.append(rowSelected) return rangeSelected # 粘贴指定范围数据的函数(保留原有逻辑) def pasteRange(startCol, startRow, endCol, endRow, sheetReceiving, copiedData): countRow = 0 for i in range(startRow, endRow + 1): countCol = 0 for j in range(startCol, endCol + 1): sheetReceiving.cell(row=i, column=j).value = copiedData[countRow][countCol] countCol += 1 countRow += 1 # 处理单组工作表的函数,接收源表和目标表作为参数 def process_sheet(source_sheet, dest_sheet): # 复制源表指定范围(沿用你原有的范围:17列-19列,11行-29行) selected_range = copyRange(17, 11, 19, 29, source_sheet) # 粘贴到目标表指定范围(原有的:16列-18列,11行-29行) pasteRange(16, 11, 18, 29, dest_sheet, selected_range) # 循环遍历所有对应工作表 for source_sheet, dest_sheet in zip(source_wb.worksheets, dest_wb.worksheets): # 可选:校验工作表名称匹配,防止结构意外变化导致错误 if source_sheet.title != dest_sheet.title: print(f"警告:工作表名称不匹配 - 源表:{source_sheet.title},目标表:{dest_sheet.title}") continue process_sheet(source_sheet, dest_sheet) # 保存修改后的目标工作簿 dest_wb.save("output.xlsx")
关键修改说明
- 移除了原指定单个工作表的代码,改用
zip(source_wb.worksheets, dest_wb.worksheets)同时遍历两个工作簿的工作表,确保第N个源表对应第N个目标表 - 将原
createData函数改为process_sheet,接收源工作表和目标工作表作为参数,实现逻辑复用 - 将工作簿保存操作移到循环结束后,提升效率
- 可选添加工作表名称校验,避免因工作簿结构变化导致数据粘贴错误
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

