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

如何在Python中读取Excel命名范围数据、实现数据读写并打包为exe?

读取Excel命名范围到Python变量及打包exe关联数据文件方案

1. 读取不同结构的Excel命名范围

推荐使用openpyxl库,它原生支持Excel的命名范围(Named Ranges),能轻松处理单个单元格、多行列等不同结构的数据。

安装依赖

pip install openpyxl

读取单个单元格类型的命名范围

适用于球队名称、配色这类单个值的命名范围:

from openpyxl import load_workbook

# 加载工作簿,data_only=True确保读取单元格计算后的值而非公式
wb = load_workbook("橄榄球数据.xlsx", data_only=True)

# 获取指定命名范围
team_name_range = wb.defined_names["球队名称"]
# 解析命名范围对应的工作表和单元格
for sheet_name, cell_range in team_name_range.destinations:
    sheet = wb[sheet_name]
    team_name = sheet[cell_range].value
print(f"球队名称: {team_name}")

读取多行列类型的命名范围(如阵型数据)

# 获取阵型的命名范围
formation_range = wb.defined_names["阵型1"]
for sheet_name, cell_range in formation_range.destinations:
    sheet = wb[sheet_name]
    # 转换为二维列表存储阵型数据
    formation_data = []
    for row in sheet[cell_range]:
        row_data = [cell.value for cell in row]
        formation_data.append(row_data)

# 输出阵型数据
print("阵型1数据:")
for row in formation_data:
    print(row)

批量读取所有命名范围

for name_obj in wb.defined_names:
    print(f"命名范围名称: {name_obj.name}")
    for sheet_name, cell_range in name_obj.destinations:
        sheet = wb[sheet_name]
        # 判断是单个单元格还是多行列范围
        if ":" not in cell_range:
            # 单个单元格
            value = sheet[cell_range].value
            print(f"  对应值: {value}")
        else:
            # 多行列数据
            data_rows = []
            for row in sheet[cell_range]:
                data_rows.append([cell.value for cell in row])
            print(f"  数据行数: {len(data_rows)}")

2. 打包exe时实现数据文件的读写

方案1:Excel文件与exe同目录(支持读写)

适合需要让教练修改数据的场景,操作简单:

  • 打包完成后,将Excel文件和exe放在同一文件夹分发
  • 代码中通过动态获取路径确保读取正确:
import os
from openpyxl import load_workbook

# 获取当前程序所在目录(开发时是脚本目录,打包后是exe所在目录)
current_dir = os.path.dirname(os.path.abspath(__file__))
excel_path = os.path.join(current_dir, "橄榄球数据.xlsx")

# 检查文件是否存在
if not os.path.exists(excel_path):
    print("错误:未找到橄榄球数据.xlsx,请确保文件与exe在同一目录!")
    exit(1)

# 读取数据
wb = load_workbook(excel_path, data_only=True)

# 写入示例:更新战术内容
tactics_sheet = wb["战术表"]
tactics_sheet["B3"] = "新战术细节"
wb.save(excel_path)

方案2:将Excel嵌入exe(只读+可选导出修改)

如果不需要教练直接修改源数据,可将Excel打包进exe,仅在需要时导出修改后的数据:

  1. 打包命令(使用PyInstaller):
pyinstaller --onefile --add-data "橄榄球数据.xlsx;." your_script.py

(Windows系统用;分隔路径,Mac/Linux用:)

  1. 代码中读取嵌入的文件:
import os
import sys
from openpyxl import load_workbook

def get_excel_path():
    # 判断当前是开发环境还是打包后的exe环境
    if getattr(sys, 'frozen', False):
        # 打包后文件会被解压到临时目录,sys._MEIPASS指向该目录
        base_path = sys._MEIPASS
    else:
        base_path = os.path.dirname(os.path.abspath(__file__))
    return os.path.join(base_path, "橄榄球数据.xlsx")

# 读取嵌入的Excel文件
excel_path = get_excel_path()
wb = load_workbook(excel_path, data_only=True)

# 若要保存修改,需导出到用户可访问的目录(比如文档文件夹)
user_doc_dir = os.path.expanduser("~/Documents")
save_path = os.path.join(user_doc_dir, "修改后的橄榄球数据.xlsx")
wb.save(save_path)

打包注意事项

  • 若PyInstaller未自动识别openpyxl,可添加--hidden-import openpyxl参数强制引入
  • 方案1需告知教练不要随意移动Excel文件位置,避免程序找不到数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:25:15