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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:40:33