如何用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
相关产品推荐
相关产品推荐

