如何在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,仅在需要时导出修改后的数据:
- 打包命令(使用PyInstaller):
pyinstaller --onefile --add-data "橄榄球数据.xlsx;." your_script.py
(Windows系统用;分隔路径,Mac/Linux用:)
- 代码中读取嵌入的文件:
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
相关产品推荐
相关产品推荐

