如何在Python Pandas中拆分Excel工作表并保留源格式?
解决Excel拆分时保留源格式的问题
问题原因
Pandas的read_excel和to_excel仅专注于数据读取与写入,不会识别或保留单元格的格式信息(如字体样式、颜色、对齐方式、单元格宽度等),因此用原代码拆分后会丢失源文件的格式设置。
解决方案
改用openpyxl库直接操作Excel工作簿,它支持完整读取并保留格式信息。以下是修改后的可运行代码:
from openpyxl import load_workbook import os # 加载源工作簿与目标工作表 source_wb = load_workbook(r'mypath\\myfile.xlsx') source_ws = source_wb['Sheet2'] # 目标文件夹路径 target_folder = 'my target folder' # 自动创建目标文件夹(不存在时) os.makedirs(target_folder, exist_ok=True) # 定位STD列的位置(假设表头在第一行) std_col_idx = None for col in range(1, source_ws.max_column + 1): if source_ws.cell(row=1, column=col).value == 'STD': std_col_idx = col break if not std_col_idx: raise ValueError("未找到表头'STD',请检查源文件") # 收集所有STD列的唯一值 std_unique_values = [] for row in range(2, source_ws.max_row + 1): cell_val = source_ws.cell(row=row, column=std_col_idx).value if cell_val not in std_unique_values: std_unique_values.append(cell_val) # 按STD值拆分并保留格式 for val in std_unique_values: # 以源文件为模板创建新工作簿,继承所有格式 new_wb = load_workbook(r'mypath\\myfile.xlsx') new_ws = new_wb['Sheet2'] # 收集需要删除的行(从下往上删,避免索引错乱) rows_to_remove = [] for row in range(2, new_ws.max_row + 1): if new_ws.cell(row=row, column=std_col_idx).value != val: rows_to_remove.append(row) # 倒序删除不符合条件的行 for row in reversed(rows_to_remove): new_ws.delete_rows(row) # 重命名工作表 new_ws.title = str(val) # 保存拆分后的文件 save_path = os.path.join(target_folder, f"{val}.xlsx") new_wb.save(save_path) print(f"文件已创建在 {target_folder} 文件夹")
代码说明
- 格式继承:通过
load_workbook直接加载源文件作为模板,新工作簿会完整继承源文件的所有格式设置。 - 行处理逻辑:倒序删除非目标行,避免删除行后导致后续行索引偏移的问题。
- 路径规范:使用
os.path.join拼接文件路径,避免手动拼接时出现的路径分隔符错误。
前置准备
运行代码前需确保已安装openpyxl库,执行以下命令安装:
pip install openpyxl
内容的提问来源于stack exchange,提问作者Ramakrishna G
相关产品推荐
相关产品推荐

