You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

关键修改点说明

  1. 替换原循环逻辑:不再直接使用rows_from_range获取的单元格位置赋值,而是通过计算相对偏移量来定位目标单元格。
  2. 行列索引转换:使用column_index_from_string将列名(如A、B)转为数字索引,方便计算偏移;若需要反向转换可使用get_column_letter。
  3. 灵活配置区域:只需修改source_range和dest_start_cell两个变量,即可实现任意源区域到任意目标起始位置的复制。

内容的提问来源于stack exchange,提问作者Boomer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:03:23