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

Python使用openpyxl加载Excel到字典仅保留最后一行问题求解

问题原因
  • 核心错误是遍历每行数据时,始终对data字典的同一组固定Key执行赋值操作,新行数据会直接覆盖上一行的旧数据,循环结束后自然仅保留最后一行的内容。
  • 原有数据结构不符合需求:你定义的data和data['dict1']都是单层字典,既没有预留行号索引的层级,也没有按列名分组存储多值的结构。
解决方案

调整数据结构同时满足「按行号访问」和「按列名分组」两个需求,我们新增两个顶层Key:by_row负责按行号存储整行数据,by_column负责按列名存储该列所有值,实现代码如下:

import openpyxl
from pathlib import Path

xlsx_file = Path(Path.home(), 'FormaterPythonUniversity', 'Template.xlsx')
wb_obj = openpyxl.load_workbook(xlsx_file) 
sheet = wb_obj.active

# 初始化数据结构
data = {
    "by_row": {},  # 行号为Key,存储对应行的所有列数据
    "by_column": {} # 列名为Key,存储该列所有行的取值列表
}

# 读取第一行作为列名
col_names = [cell.value for cell in sheet[1]]
# 初始化每列的空列表
for name in col_names:
    data["by_column"][name] = []

# 从第二行开始遍历数据行,行号从1开始计数
for row_num, row in enumerate(sheet.iter_rows(min_row=2, values_only=True), start=1):
    # 存入按行索引的结构
    data["by_row"][row_num] = {
        col_names[0]: row[0],
        col_names[1]: row[1],
        col_names[2]: row[2],
        col_names[3]: row[3],
        col_names[4]: row[4],
        col_names[5]: row[5]
    }
    # 追加到对应列的分组列表
    for idx, name in enumerate(col_names):
        data["by_column"][name].append(row[idx])

# 使用示例
print("第1行数据的经理姓名:", data["by_row"][1]["Manager name"])
print("所有员工的邮箱列表:", data["by_column"]["Work email address"])
print(data)

使用说明

  • 按行号访问单元格:调用格式为data["by_row"][行号][列名],行号从1开始计数,对应Excel表格中表头后的第一行数据。
  • 按列名取全列值:调用格式为data["by_column"][列名],返回值为该列所有行数据组成的列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:15:05