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

使用Python和GSpread上传DataFrame至谷歌表格的格式保持问题

解决谷歌表格中多级索引DataFrame格式对齐Excel的问题

问题根源

你分组后的DataFrame是三级多级索引(Name/Type/Metric),Excel会自动合并同一索引层级中连续重复值的单元格,但set_with_dataframe默认会将每个索引项单独显示在单元格中,不会自动合并,导致格式和Excel不一致。

解决方案步骤

我们需要手动处理多级索引列的单元格合并,同时设置表头格式,让谷歌表格和Excel格式对齐:

1. 先上传DataFrame到谷歌表格

保留你原有的上传逻辑,确保索引和表头都被正确导入:

from gspread_formatting import *
import gspread
from gspread_dataframe import set_with_dataframe
import pandas as pd

# 假设已完成gspread授权并获取目标工作表worksheet1
worksheet1.clear()
set_with_dataframe(
    worksheet=worksheet1,
    dataframe=DF1,
    row=1,
    include_index=True,
    include_column_header=True,
    resize=True
)

2. 合并多级索引列的重复单元格

遍历每个索引层级,识别连续重复值的行范围,批量合并对应单元格:

# 获取索引层级数和表格总行数(含表头行)
index_level_count = DF1.index.nlevels
total_table_rows = len(DF1) + 1  # +1对应表头行

# 逐个处理每个索引层级(对应表格的A、B、C列)
for level_idx in range(index_level_count):
    # 提取当前层级的所有索引值
    level_values = DF1.index.get_level_values(level_idx).tolist()
    current_value = level_values[0]
    start_merge_row = 2  # 数据行从第2行开始
    
    # 遍历找连续重复值区间
    for row_num in range(1, len(level_values)):
        if level_values[row_num] != current_value:
            # 合并从start_merge_row到当前行的前一行
            if start_merge_row < row_num + 1:
                merge_cells(
                    worksheet1,
                    f"{chr(65 + level_idx)}{start_merge_row}:{chr(65 + level_idx)}{row_num + 1}"
                )
            current_value = level_values[row_num]
            start_merge_row = row_num + 2
    # 处理最后一组连续重复值
    if start_merge_row < total_table_rows:
        merge_cells(
            worksheet1,
            f"{chr(65 + level_idx)}{start_merge_row}:{chr(65 + level_idx)}{total_table_rows}"
        )

3. 设置表头与索引列格式(对齐Excel默认样式)

添加加粗、居中对齐等格式,匹配Excel的表头显示效果:

# 表头行格式:加粗+居中
header_style = CellFormat(
    textFormat=TextFormat(bold=True),
    horizontalAlignment='CENTER'
)
format_cell_range(worksheet1, '1:1', header_style)

# 索引列格式:居中对齐
index_col_range = f"A:{chr(65 + index_level_count - 1)}"
index_style = CellFormat(horizontalAlignment='CENTER')
format_cell_range(worksheet1, index_col_range, index_style)

补充说明

  • 代码中chr(65 + level_idx)用于将索引层级转换为谷歌表格的列字母(0对应A,1对应B,以此类推),自动适配不同数量的索引层级。
  • resize=True已自动调整列宽,若需更精细控制,可使用set_column_width方法单独设置列宽。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:40:57