You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python将xlsx文件指定区域复制到新工作表并保留格式?

用Python复制Excel特定行列范围并保留所有格式的可行方案

嘿,这个需求我之前做项目时刚好碰到过!要完整保留格式确实不能只复制单元格值,得用专门处理Excel样式的库来搞定,我给你分享一个经过验证的方案,用openpyxl就能实现:

先准备依赖

首先确保你安装了openpyxl,这是目前处理xlsx格式最靠谱的Python库,支持完整的样式复制:

pip install openpyxl

完整代码实现

下面的代码会把原工作表中指定的行列范围,完整复制到新工作表里,包括字体、颜色、边框、对齐方式、行高列宽,甚至合并单元格都能保留:

from openpyxl import load_workbook, Workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import copy_style

# 1. 加载源工作簿和工作表,data_only=False确保保留公式和样式
source_wb = load_workbook("你的源文件.xlsx", data_only=False)
source_ws = source_wb["源工作表名称"]

# 2. 创建目标工作簿和新工作表(也可以在源工作簿内新建)
target_wb = Workbook()
target_ws = target_wb.active
target_ws.title = "复制后的新工作表"

# 3. 定义要复制的行列范围(自行修改)
start_row = 2    # 起始行
end_row = 10     # 结束行
start_col = 1    # 起始列(A列对应1)
end_col = 5      # 结束列(E列对应5)

# 4. 复制单元格内容和样式
for row_num in range(start_row, end_row + 1):
    for col_num in range(start_col, end_col + 1):
        # 获取源单元格和目标单元格位置(目标表从第1行第1列开始)
        source_cell = source_ws.cell(row=row_num, column=col_num)
        target_cell = target_ws.cell(
            row=row_num - start_row + 1,
            column=col_num - start_col + 1
        )
        # 复制单元格值(包括公式)
        target_cell.value = source_cell.value
        # 完整复制单元格样式
        copy_style(source_cell, target_cell)

# 5. 复制行高(行高是工作表的行维度属性,不是单元格属性)
for row_num in range(start_row, end_row + 1):
    target_row = row_num - start_row + 1
    target_ws.row_dimensions[target_row].height = source_ws.row_dimensions[row_num].height

# 6. 复制列宽(同理,列宽是列维度属性)
for col_num in range(start_col, end_col + 1):
    source_col_letter = get_column_letter(col_num)
    target_col_letter = get_column_letter(col_num - start_col + 1)
    target_ws.column_dimensions[target_col_letter].width = source_ws.column_dimensions[source_col_letter].width

# 7. 处理合并单元格(如果源区域有合并单元格的话)
for merge_range in source_ws.merged_cells.ranges:
    # 判断合并区域是否在我们要复制的范围内
    if (merge_range.min_row >= start_row and merge_range.max_row <= end_row and
        merge_range.min_col >= start_col and merge_range.max_col <= end_col):
        # 转换为目标工作表的对应区域
        new_min_row = merge_range.min_row - start_row + 1
        new_max_row = merge_range.max_row - start_row + 1
        new_min_col = merge_range.min_col - start_col + 1
        new_max_col = merge_range.max_col - start_col + 1
        # 在目标表中合并对应单元格
        target_ws.merge_cells(
            start_row=new_min_row, start_column=new_min_col,
            end_row=new_max_row, end_column=new_max_col
        )

# 8. 保存目标工作簿
target_wb.save("复制结果文件.xlsx")

关键细节说明

  • copy_style是核心:这个方法会完整复制单元格的所有样式,包括字体、字号、颜色、背景色、边框、对齐方式、数字格式等,比手动设置每个样式属性高效得多。
  • 行高列宽单独处理:因为行高和列宽属于工作表的行/列维度设置,不是单个单元格的属性,所以需要单独遍历复制。
  • 合并单元格额外处理:如果源区域有合并单元格,需要判断合并范围是否在我们要复制的区间内,再转换到目标表的对应位置进行合并。
  • data_only=False:这个参数确保加载的是单元格的公式而非计算后的结果,如果只需要值,可以改成True,但会丢失公式。

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

火山引擎 最新活动