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

如何按行数上限与客户唯一性拆分百万行Excel文件?技术求助

Excel文件按客户完整性拆分(单文件不超10000行)

问题背景

现有120万行数据的.xlsx文件,需要拆分为单文件最大行数不超过10000的小文件,核心要求是同一客户的所有发票数据不能拆分到多个文件。例如当某个客户的部分数据刚好处于10000行临界点时,需将该客户的全部数据归入下一个文件。当前使用的Pandas代码仅能按固定行数拆分,无法满足客户数据完整性要求。

实现思路

  1. 读取完整的原Excel数据(若内存压力过大,可改用分块读取并跟踪客户边界,本文以全量读取为例)
  2. 按客户标识列(ObchodnyPartner)分组,确保同一客户的所有数据连续
  3. 逐组累加行数,当累加后总长度超过10000行时,将当前已累加的所有组导出为一个文件,重置累加器后继续处理剩余组
  4. 处理最后剩余的未导出数据

完整实现代码

import os
from pathlib import Path
import pandas as pd

root_path = "你的根路径"
month_folder = "你的月份文件夹"
url = "输出文件夹名称"
rows_limit = 10000  # 单文件最大行数
header = ['Zmluva','UcOk','SU','Odb.miesto','ZmluvnuUcet','ObchodnyPartner','ZacZucObd','Kon.zuc.ob','C.zuct.dokl','Tlac.dokl','DrZuct','FaktPosSluz','FaktObl','OdpJedn','SU','TypTarify','Tarifa','Sk.faktov', 'EIC','Mesiac']

# 遍历目标文件夹下的所有xlsx文件
for file in Path(os.path.join(root_path, month_folder)).glob('*.xlsx'):
    in_xlsx = file
    file_name = os.path.basename(file)
    base_name = os.path.splitext(file_name)[0]
    output_dir = os.path.join(root_path, url)
    os.makedirs(output_dir, exist_ok=True)  # 确保输出文件夹存在

    # 读取完整数据并指定表头
    df = pd.read_excel(in_xlsx, header=None, names=header)
    
    # 按客户分组,保留原始数据顺序
    customer_groups = df.groupby('ObchodnyPartner', sort=False)
    
    current_chunk = []
    current_row_count = 0
    file_index = 0

    for customer, group in customer_groups:
        group_row_count = len(group)
        # 检查加上当前客户组后是否超过行数限制
        if current_row_count + group_row_count > rows_limit and current_row_count > 0:
            # 导出当前积累的chunk
            chunk_df = pd.concat(current_chunk, ignore_index=True)
            out_file = os.path.join(output_dir, f"{base_name}_{file_index}.xlsx")
            chunk_df.to_excel(out_file, index=False, header=True)
            
            # 重置chunk和计数,将当前客户组作为新chunk的起始
            current_chunk = [group]
            current_row_count = group_row_count
            file_index += 1
        else:
            # 将当前客户组加入chunk
            current_chunk.append(group)
            current_row_count += group_row_count
    
    # 导出最后剩余的chunk
    if current_chunk:
        chunk_df = pd.concat(current_chunk, ignore_index=True)
        out_file = os.path.join(output_dir, f"{base_name}_{file_index}.xlsx")
        chunk_df.to_excel(out_file, index=False, header=True)

关键代码说明

  • 分组逻辑:使用groupby('ObchodnyPartner', sort=False)保证客户的原始顺序不变,避免打乱数据原有排列
  • 行数判断:每次添加客户组前检查总长度,若超过限制则先导出当前已积累的内容,再将当前客户组作为新chunk的起始
  • 输出处理:自动创建输出文件夹,文件命名采用原文件名_索引.xlsx的格式,确保文件名清晰唯一

内容的提问来源于stack exchange,提问作者Witchery

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:15:59