如何用Python筛选Excel数据并保留单元格格式与注释
解决方案:按Brand拆分Excel并保留格式与注释
核心思路
直接复制原工作簿的完整结构(包含格式、注释、表头信息),然后在副本中删除不属于目标品牌的行,这样能100%保留原文件的所有格式和注释信息,同时完成拆分需求。
示例代码
from openpyxl import load_workbook import os # 配置参数 source_file = "原始数据.xlsx" sheet_name = "Sheet1" # 替换为你的工作表名称 brand_col = "A" # 替换为Brand字段所在的列(比如A列) header_row = 1 # 表头所在行号 # 第一步:读取所有Brand值,获取唯一品牌列表(只读模式,不修改原文件) wb_read = load_workbook(source_file, read_only=True) ws_read = wb_read[sheet_name] # 转换列字母为索引(A对应1,B对应2...) brand_col_idx = ord(brand_col.upper()) - ord('A') + 1 # 提取所有Brand值(跳过表头) all_brands = [row[brand_col_idx - 1].value for row in ws_read.iter_rows(min_row=header_row+1)] # 去重并过滤空值 unique_brands = list(set(filter(None, all_brands))) wb_read.close() # 第二步:为每个品牌生成专属工作簿 for brand in unique_brands: # 加载原工作簿,完整保留格式与注释 wb = load_workbook(source_file) ws = wb[sheet_name] # 记录需要删除的行号(非目标品牌的行) rows_to_delete = [] for row_num in range(header_row+1, ws.max_row+1): cell_value = ws[f"{brand_col}{row_num}"].value if cell_value != brand: rows_to_delete.append(row_num) # 从后往前删除行,避免索引错乱 for row_num in reversed(rows_to_delete): ws.delete_rows(row_num) # 保存文件 output_file = f"{brand}.xlsx" if os.path.exists(output_file): os.remove(output_file) wb.save(output_file) wb.close() print(f"已生成文件:{output_file}")
关键注意事项
- 效率优化:几十万行数据场景下,用只读模式读取品牌列表速度更快;从后往前删除行可避免遍历过程中索引偏移的问题,比边遍历边删效率更高。
- 格式完整性:直接加载原工作簿的方式,会完整保留单元格颜色、字体、注释、表头注释等所有格式信息,解决Pandas或Xlsxwriter丢失格式的问题。
- 空值处理:代码中过滤了Brand为空的行,若需要保留空值对应的独立文件,可去掉
filter(None, all_brands)部分。 - 列适配:如果Brand字段不在A列,只需修改
brand_col参数(比如B列写"B"),代码会自动转换为对应列索引。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

