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

如何将Jupyter Lab生成的Excel文件下载到本地系统下载文件夹?

解决Jupyter Lab生成Excel文件直接下载到本地下载文件夹的问题

你遇到的问题核心在于:当Jupyter Lab运行在远程服务器(或容器)中时,os.path.expanduser("~")指向的是服务器端的用户目录,而非你本地电脑的下载文件夹,所以文件会被存在服务器上,无法直接同步到本地。要让文件下载到每个用户自己的本地Downloads文件夹,需要通过浏览器触发下载,把文件从服务器传输到客户端。

下面提供两种可行的实现方式:

方法一:使用ipywidgets的FileDownload组件(推荐)

这个方法直观易用,生成一个可点击的下载按钮,用户点击后文件会自动下载到本地默认下载目录。

修改后的代码如下:

import pandas as pd
import numpy as np
import xlsxwriter
from io import BytesIO
from ipywidgets import FileDownload
from IPython.display import display

def create_dataframes():
    df = pd.DataFrame(np.array([["A", 2021, 200, 400], 
                                ["B", 2020, 600, 300],
                                ["A", 2021, 500, 250], 
                                ["B", 2030,  350, 432],
                                ["C", 2022,  250, 532],
                                ["C", 2022,  150, 232],]),
                      columns=['Category', 'Year', 'Value_1', 'Value_2'])
    
    df1 = pd.DataFrame(np.array([["D", 2021, 200, 400], 
                                 ["D", 2020, 600, 300],
                                 ["B", 2021, 500, 250], 
                                 ["B", 2020,  350, 432],
                                 ["C", 2022,  250, 532],
                                 ["C", 2022,  150, 232],]),
                       columns=['Category', 'Year', 'Value_1', 'Value_2'])
    
    # 将Excel文件写入内存缓冲区,而非本地文件
    output = BytesIO()
    with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
        df.to_excel(writer, sheet_name='A')        
        df1.to_excel(writer, sheet_name='C')
    # 重置缓冲区指针到起始位置
    output.seek(0)
    
    # 创建并显示下载按钮
    download_btn = FileDownload(output, filename="test_output.xlsx")
    display(download_btn)

# 调用函数生成下载按钮
create_dataframes()

方法二:使用HTML生成下载链接

如果不想依赖ipywidgets,可以用HTML的a标签生成下载链接,利用data URI实现浏览器直接下载:

import pandas as pd
import numpy as np
import xlsxwriter
from io import BytesIO
from IPython.display import HTML
import base64

def create_dataframes():
    df = pd.DataFrame(np.array([["A", 2021, 200, 400], 
                                ["B", 2020, 600, 300],
                                ["A", 2021, 500, 250], 
                                ["B", 2030,  350, 432],
                                ["C", 2022,  250, 532],
                                ["C", 2022,  150, 232],]),
                      columns=['Category', 'Year', 'Value_1', 'Value_2'])
    
    df1 = pd.DataFrame(np.array([["D", 2021, 200, 400], 
                                 ["D", 2020, 600, 300],
                                 ["B", 2021, 500, 250], 
                                 ["B", 2020,  350, 432],
                                 ["C", 2022,  250, 532],
                                 ["C", 2022,  150, 232],]),
                       columns=['Category', 'Year', 'Value_1', 'Value_2'])
    
    output = BytesIO()
    with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
        df.to_excel(writer, sheet_name='A')        
        df1.to_excel(writer, sheet_name='C')
    output.seek(0)
    
    # 将文件内容编码为base64,生成下载链接
    b64_content = base64.b64encode(output.read()).decode()
    download_link = f'<a href="data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,{b64_content}" download="test_output.xlsx">点击下载Excel文件</a>'
    display(HTML(download_link))

create_dataframes()

关键说明

  • 两种方法都是先把Excel文件写入内存的BytesIO对象,避免在服务器端创建文件;
  • 通过浏览器的下载机制,直接把内存中的文件传输到用户本地,兼容本地和远程Jupyter Lab场景,每个用户点击后都会下载到自己电脑的默认下载文件夹;
  • 若你是在本地运行Jupyter Lab(服务器就是自己的电脑),也可以直接用os.path.expanduser("~/Downloads/test_output.xlsx")作为pd.ExcelWriter的路径,但这种方法仅适用于本地场景。

内容的提问来源于stack exchange,提问作者Green Finance

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:58:15