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




