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

从Jupyter Notebook调用另一个Notebook时无法引用Excel宏文件

问题:通过main.ipynb调用Seg_pivot.ipynb时出现文件找不到错误

场景与报错

  • 执行逻辑:在根目录的main.ipynb中用代码 %run "fi/Seg_pivot.ipynb" 调用fi文件夹内的Seg_pivot.ipynb
  • 单独运行Seg_pivot.ipynb一切正常,但通过main.ipynb调用时,抛出错误:FileNotFound error: No such file: 'mymacro.xlsm'
  • Seg_pivot.ipynb中调用宏的代码片段:
import xlwings as xw
wb = xw.Book("MyMacro.xlsm")
s_macro = wb.macro("Module2.styleF")
s_macro()

问题根源

工作目录不一致导致相对路径失效:

  • 单独运行Seg_pivot.ipynb时,Jupyter的工作目录是fi/文件夹,代码中"MyMacro.xlsm"的相对路径基于fi/,能正确找到目标文件
  • 通过main.ipynb调用时,工作目录是根目录,代码仍用相同相对路径,会从根目录查找MyMacro.xlsm,自然找不到

解决方案

方案1:使用绝对路径(推荐)

通过代码获取当前Notebook的路径,拼接宏文件的绝对路径,避免工作目录影响:

import os
import xlwings as xw

# 获取当前Notebook所在文件夹路径
notebook_dir = os.path.dirname(os.path.abspath("Seg_pivot.ipynb"))
# 根据实际目录结构拼接宏文件路径(假设MyMacro.xlsm在根目录的MyMacro文件夹下)
macro_file_path = os.path.join(notebook_dir, "../MyMacro/MyMacro.xlsm")

wb = xw.Book(macro_file_path)
s_macro = wb.macro("Module2.styleF")
s_macro()

方案2:切换工作目录

在Seg_pivot.ipynb开头添加代码,将工作目录切换到自身所在的fi/文件夹:

import os

# 切换到当前Notebook所在的文件夹
os.chdir("./fi")

方案3:使用基于根目录的相对路径

如果目录结构固定,直接写从根目录出发的相对路径:

import xlwings as xw

# 假设MyMacro.xlsm在根目录的MyMacro文件夹内
wb = xw.Book("MyMacro/MyMacro.xlsm")
s_macro = wb.macro("Module2.styleF")
s_macro()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:57:18