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

如何用Python拆分Excel并保留ArchivesSpace模板的前5行表头?

问题:拆分Excel时保留前5行专用表头

我有一个包含近40000条记录的Excel表格,需要从第6行开始根据C列(字段名ead)的值拆分为多个文件。目前已实现拆分功能,但无法保留前5行的ArchivesSpace专用模板表头——必须完整保留1-5行的信息,仅保留字段代码的尝试未成功。

之前尝试的代码:

import pandas as pd
import os
import openpyxl

df = pd.read_excel('container_list_master.xlsx')
column_name = 'ead'
unique_values = df[column_name].unique()

for unique_value in unique_values:
    df_output = df[df[column_name].str.contains(unique_value)]
    output_path =os.path.join('output', unique_value + '.xlsx')
    df_output.to_excel(output_path, sheet_name=unique_value, index=False)
解决方案:保留前5行模板的拆分代码

原代码用pandas直接读取会默认把第6行识别为表头,丢失前5行的模板内容。改用openpyxl直接操作Excel对象,既能完整保留模板格式,又能按需求拆分数据:

import openpyxl
import os

# 创建输出目录(不存在则自动创建)
os.makedirs('output', exist_ok=True)

# 打开原Excel文件
wb = openpyxl.load_workbook('container_list_master.xlsx')
ws = wb.active

# 提取前5行的模板内容(含格式)
template_rows = []
for row in ws.iter_rows(min_row=1, max_row=5, values_only=False):
    template_rows.append([cell for cell in row])

# 提取数据表头(第6行)和数据行(第7行及以后),C列对应索引2(从0开始)
data_header = [cell.value for cell in ws[6]]
data_rows = []
for row in ws.iter_rows(min_row=7, values_only=True):
    data_rows.append(row)

# 按C列的`ead`值分组数据
groups = {}
for row in data_rows:
    ead_val = row[2]
    if ead_val not in groups:
        groups[ead_val] = []
    groups[ead_val].append(row)

# 生成每个分组的Excel文件
for ead_val, rows in groups.items():
    # 创建新工作簿
    new_wb = openpyxl.Workbook()
    new_ws = new_wb.active
    new_ws.title = str(ead_val)
    
    # 写入前5行模板内容(含格式复制)
    for row_num, row_cells in enumerate(template_rows, start=1):
        for col_num, cell in enumerate(row_cells, start=1):
            new_cell = new_ws.cell(row=row_num, column=col_num, value=cell.value)
            # 复制原单元格格式(可选,若不需要格式可删除这几行)
            new_cell.font = cell.font.copy()
            new_cell.fill = cell.fill.copy()
            new_cell.border = cell.border.copy()
            new_cell.alignment = cell.alignment.copy()
    
    # 写入数据表头(第6行)
    for col_num, val in enumerate(data_header, start=1):
        new_ws.cell(row=6, column=col_num, value=val)
    
    # 写入分组数据(从第7行开始)
    for row_num, row in enumerate(rows, start=7):
        for col_num, val in enumerate(row, start=1):
            new_ws.cell(row=row_num, column=col_num, value=val)
    
    # 保存文件
    output_path = os.path.join('output', f"{ead_val}.xlsx")
    new_wb.save(output_path)
    print(f"已生成文件: {output_path}")

关键说明:

  • 直接操作Excel单元格,完美保留前5行的模板内容和格式
  • 手动拆分数据部分,避免pandas自动识别表头导致的模板丢失
  • 兼容4万条记录的大文件,内存占用更高效
  • 若不需要保留模板格式,可删除复制格式的代码段,提升运行速度

内容的提问来源于stack exchange,提问作者Scott Meyer-Kukan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:22:39