如何用openpyxl将Excel指定区域复制到另一工作簿的任意区域?
自定义Excel单元格区域复制到目标任意位置(openpyxl实现)
需求说明
需要将某Excel工作簿指定工作表的任意单元格区域,复制到另一工作簿指定工作表的自定义目标区域中。当前基于openpyxl的代码仅能将内容粘贴到与源区域相同的位置,需修改实现自定义目标位置的功能,且支持任意大小的源区域。
操作示例
Excel Sheet Source Excel Sheet Destination A B A B C D E 1 a e 1 2 b f 2 3 a e 4 b f
原代码(仅支持同位置粘贴)
import os import openpyxl as xl from openpyxl.utils import rows_from_range # Assign Folder & Files variables desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop') practicefolder = 'Practice' source_file = 'source_file.xlsx' destination_file = 'destination_file.xlsx' # Opening the source excel file filename = (desktop + '\\' + practicefolder + '\\' + source_file) wb1 = xl.load_workbook(filename) ws1 = wb1.worksheets[0] # Opening the destination excel file filename1 = (desktop + '\\' + practicefolder + '\\' + destination_file) # dest = 'dest_sheet2' # For assigning different sheet wb2 = xl.load_workbook(filename1) ws2 = wb2.active # Selecting the copy range below range_str = 'A1:B2' # Select copy range src = ws1 dst = ws2 for row in rows_from_range(range_str): for cell in row: dst[cell].value = src[cell].value wb2.save(str(filename1))
修改后的解决方案(支持自定义目标区域)
核心思路:解析源区域的行列范围,计算每个单元格相对于源区域起始位置的偏移量,再将偏移量映射到目标区域的起始位置,实现内容的对应复制。
修改后的完整代码:
import os import openpyxl as xl from openpyxl.utils import column_index_from_string, get_column_letter # Assign Folder & Files variables desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop') practicefolder = 'Practice' source_file = 'source_file.xlsx' destination_file = 'destination_file.xlsx' # Opening the source excel file filename = os.path.join(desktop, practicefolder, source_file) wb1 = xl.load_workbook(filename) ws1 = wb1.worksheets[0] # 可修改为指定工作表,比如wb1['Sheet1'] # Opening the destination excel file filename1 = os.path.join(desktop, practicefolder, destination_file) wb2 = xl.load_workbook(filename1) ws2 = wb2.active # 可修改为指定工作表,比如wb2['dest_sheet2'] # 配置源区域和目标起始单元格 source_range = 'A1:B2' # 源单元格区域 dest_start_cell = 'D3' # 目标区域的起始单元格(示例中对应D3) # 解析源区域的起始、结束单元格 src_start, src_end = source_range.split(':') # 源起始列(转成索引,A=1, B=2...) src_start_col = column_index_from_string(src_start[0]) # 源起始行 src_start_row = int(src_start[1:]) # 源结束列 src_end_col = column_index_from_string(src_end[0]) # 源结束行 src_end_row = int(src_end[1:]) # 解析目标起始单元格 dest_start_col = column_index_from_string(dest_start_cell[0]) dest_start_row = int(dest_start_cell[1:]) # 遍历源区域的每个单元格,复制到目标区域对应位置 for row_offset in range(src_end_row - src_start_row + 1): for col_offset in range(src_end_col - src_start_col + 1): # 获取源单元格 src_cell = ws1.cell( row=src_start_row + row_offset, column=src_start_col + col_offset ) # 计算目标单元格位置 dest_cell = ws2.cell( row=dest_start_row + row_offset, column=dest_start_col + col_offset ) # 复制单元格值 dest_cell.value = src_cell.value # 保存目标工作簿 wb2.save(filename1)
关键修改点说明
- 替换原循环逻辑:不再直接使用
rows_from_range获取的单元格位置赋值,而是通过计算相对偏移量来定位目标单元格。 - 行列索引转换:使用
column_index_from_string将列名(如A、B)转为数字索引,方便计算偏移;若需要反向转换可使用get_column_letter。 - 灵活配置区域:只需修改
source_range和dest_start_cell两个变量,即可实现任意源区域到任意目标起始位置的复制。
内容的提问来源于stack exchange,提问作者Boomer
相关产品推荐
相关产品推荐

