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

Web应用中如何用Pandas读取含分组折叠列的Excel文件?

处理带分组折叠列的Excel文件的Pandas解决方案

以下几个方案可以在不修改原始上传文件、无需提前知晓分组信息的前提下,解决Pandas读取空DataFrame的问题:

1. 用openpyxl引擎先展开所有折叠分组

分组折叠的列本质是被标记为hidden,通过openpyxl可以在内存中修改工作簿的列隐藏属性,再交给Pandas读取:

import pandas as pd
from openpyxl import load_workbook

def read_grouped_excel(file_obj):
    # 加载上传的文件对象(支持BytesIO或本地路径)
    wb = load_workbook(file_obj, read_only=False, keep_links=False)
    for ws in wb.worksheets:
        # 展开所有列的折叠分组
        for col_dim in ws.column_dimensions.values():
            col_dim.hidden = False
        # 若存在行分组折叠,同样展开
        for row_dim in ws.row_dimensions.values():
            row_dim.hidden = False
    # 从处理后的内存工作簿读取数据
    df = pd.read_excel(wb, engine='openpyxl')
    return df

注:如果是Web应用接收的上传文件,通常是BytesIO对象,直接传入load_workbook即可,无需保存到本地。

2. 直接用openpyxl提取所有列数据

如果Pandas仍无法识别,可绕过Pandas的读取逻辑,直接用openpyxl遍历所有单元格(包括隐藏列),手动构建DataFrame:

import pandas as pd
from openpyxl import load_workbook

def extract_all_excel_data(file_obj):
    wb = load_workbook(file_obj, read_only=True)
    ws = wb.active
    # 获取所有列的数值(包括隐藏列)
    all_columns = list(ws.iter_cols(values_only=True))
    # 假设第一行为表头
    headers = all_columns[0]
    # 转置数据行(iter_cols按列返回,转成按行的结构)
    data_rows = list(zip(*all_columns[1:]))
    return pd.DataFrame(data_rows, columns=headers)

这种方法完全不受分组折叠影响,直接读取Excel底层的所有单元格数据。

3. 处理合并表头导致的分组折叠

部分分组折叠的Excel会伴随合并单元格表头,导致Pandas无法正确识别列结构,此时需要先解析合并单元格信息,重构表头:

import pandas as pd
from openpyxl import load_workbook

def handle_merged_header_excel(file_obj):
    wb = load_workbook(file_obj, read_only=True)
    ws = wb.active
    merged_ranges = ws.merged_cells.ranges
    # 假设第一行是分组主表头,第二行是子列名
    group_headers = [cell.value for cell in ws[1]]
    sub_headers = [cell.value for cell in ws[2]]
    full_headers = []
    
    for col_idx, sub_header in enumerate(sub_headers):
        current_col = col_idx + 1  # openpyxl列索引从1开始
        # 查找当前列所属的合并分组
        for merged_range in merged_ranges:
            if current_col in merged_range.cols:
                group_name = group_headers[merged_range.min_col - 1]
                full_headers.append(f"{group_name}_{sub_header}")
                break
        else:
            full_headers.append(sub_header)
    
    # 跳过前两行表头,读取数据并设置新表头
    df = pd.read_excel(file_obj, engine='openpyxl', header=None, skiprows=2)
    df.columns = full_headers
    return df

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:05:23