在Excel内使用openpyxl报错“File not found”但在Spyder中运行正常
在Excel内使用openpyxl报错“File not found”但在Spyder中运行正常
我完全懂你这种挫败感——同样的代码在Spyder里能顺利生成表格图片,放到Excel自带的Python(=py)环境里就报文件找不到,明明路径也核对过,权限也开了,就是不行。先帮你梳理下问题核心,再给几个针对性的解决办法:
问题回顾
你想要实现的是:在Excel内用Python脚本读取当前文件里的命名区域,生成表格图片并插入到单元格中。代码在Spyder运行正常,但在Excel内执行时,openpyxl抛出FileNotFoundError,你已经尝试过:
- 切换路径分隔符(/、\、\\)
- 使用原始字符串前缀
r - 确认文件夹权限为可读写
- 搜索相关解决方案
核心原因分析
这种差异大多是因为Spyder和Excel的Python运行环境的工作目录不同,或者Excel的安全机制限制了脚本对文件的访问:
- Spyder运行时的工作目录通常是你脚本所在的文件夹,或者你手动设置的目录,所以硬编码的绝对路径能正常解析;
- 但Excel内的Python脚本默认工作目录可能是Excel的安装目录,或者系统默认的文档目录,不是你文件所在的文件夹,导致硬编码的路径失效;
- 另外Excel的受信任位置设置也可能阻止脚本访问非信任目录下的文件。
针对性解决办法
1. 动态获取当前Excel文件路径(最推荐)
既然你要加载的就是当前正在运行脚本的Excel文件,完全不需要硬编码路径,直接通过Excel的API获取当前文件的绝对路径:
import win32com.client import matplotlib.pyplot as plt import openpyxl from openpyxl import load_workbook # 获取当前活动的Excel工作簿路径 excel_app = win32com.client.GetActiveObject("Excel.Application") current_wb_path = excel_app.ActiveWorkbook.FullName # 加载工作簿(注意xlsm文件需要加keep_vba=True参数) wb = load_workbook(current_wb_path, keep_vba=True) # 后续读取命名区域、生成表格的代码保持不变 named_range = wb.defined_names['DT_1'] cells = named_range.destinations sheet_name, cell_range = next(cells) sheet = wb[sheet_name] data = [[cell.value for cell in row] for row in sheet[cell_range]] fig, ax = plt.subplots(figsize=(3,3), dpi=400) ax.axis('off') table = ax.table(cellText=data, loc='center', cellLoc='center') table.auto_set_font_size(False) table.set_fontsize(9) table.scale(1, 1.2) for cell in table._cells: table._cells[cell].set_edgecolor('black') table._cells[cell].set_linewidth(0.5) plt.show()
这样不管你的Excel文件移到哪个位置,脚本都能正确加载,彻底解决路径硬编码的问题。
2. 检查并调整Excel的工作目录
先打印出Excel内Python脚本的当前工作目录,确认是否和你文件所在目录一致:
import os print(os.getcwd())
如果输出的目录不是你的文件所在的C:/Users/barry/Desktop/WS Generators/,可以手动切换工作目录:
import os os.chdir("C:/Users/barry/Desktop/WS Generators/") # 之后再加载工作簿 wb = load_workbook("Stats WS Generator 2024.xlsm", keep_vba=True)
3. 添加文件夹到Excel受信任位置
Excel的安全机制可能会阻止脚本访问非信任目录的文件,你可以把文件所在文件夹添加到受信任位置:
- 打开Excel,点击「文件」→「选项」→「信任中心」→「信任中心设置」;
- 选择「受信任位置」→「添加新位置」;
- 选中你的
WS Generators文件夹,勾选「同时信任此位置的子文件夹」,点击确定。
4. 以管理员身份运行Excel
有时候Windows的UAC权限会限制Excel访问某些目录,右键Excel图标,选择「以管理员身份运行」,再打开文件运行脚本试试。
备注:内容来源于stack exchange,提问作者Mark Barry
相关产品推荐
相关产品推荐

