从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
相关产品推荐
相关产品推荐

