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

Bokeh Server环境下实现服务器向客户端传输Excel文件的技术问询

实现Bokeh Server的Excel文件下载(无需JavaScript)

嘿,这个问题我刚好处理过,不用碰复杂的JavaScript也能轻松实现Bokeh Server上的Excel文件下载!给你两种简单的方案,按需选就行:

方案一:直接下载已存在的本地文件

如果你的Excel文件已经在main.py所在目录,只需要两步就能搞定:

1. 启动Bokeh Server时配置静态目录

启动服务器时,把当前目录设为静态文件目录,这样Bokeh能直接提供目录下的文件访问:

bokeh serve --show main.py --static-dirs=./ --allow-websocket-origin=你的服务器IP:5006

(--allow-websocket-origin要填你实际的服务器地址,不然远程Firefox连接可能会有跨域问题)

2. 在界面中添加下载链接

在main.py里,用Div组件生成一个HTML下载链接,用户点击就能直接下载:

from bokeh.models import Div
from bokeh.plotting import curdoc

# 这里放你已有的可视化代码(比如生成图表、加载DataFrame等)
# ...

# 添加下载链接,替换成你的Excel文件名
download_link = Div(
    text='<a href="/static/你的文件.xlsx" download="自定义下载文件名.xlsx">点击下载Excel文件</a>',
    width=200,
    height=30
)

curdoc().add_root(download_link)

这样用户在Firefox里点击链接,浏览器就会自动下载指定文件了。


方案二:点击按钮动态生成并下载Excel

如果需要先把当前展示的DataFrame导出为Excel,再让用户下载,可以用Bokeh的服务器回调结合Tornado路由实现:

1. 修改main.py添加自定义下载路由和按钮

from bokeh.models import Button
from bokeh.events import ButtonClick
from bokeh.server.server import Server
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler
import tornado.web
import os
import pandas as pd

def make_doc(doc):
    # 这里放你已有的代码:加载MySQL数据为DataFrame、生成可视化图表
    df = pd.read_sql_query("SELECT * FROM 你的表名", 你的数据库连接)
    # ... 你的可视化代码 ...

    # 定义下载按钮点击事件
    def on_download_click(event):
        # 第一步:把DataFrame导出为Excel文件到当前目录
        df.to_excel('导出的数据.xlsx', index=False)
        # 第二步:让浏览器跳转到下载路由
        doc.add_next_tick_callback(lambda: doc.session_context._session.send_message({
            'type': 'open_url',
            'url': '/download'
        }))

    # 创建下载按钮
    download_btn = Button(label="导出并下载Excel", button_type="success")
    download_btn.on_event(ButtonClick, on_download_click)

    # 添加按钮到文档
    doc.add_root(download_btn)

# 自定义Tornado路由处理下载请求
class DownloadHandler(tornado.web.RequestHandler):
    def get(self):
        file_path = os.path.join(os.path.dirname(__file__), '导出的数据.xlsx')
        if os.path.exists(file_path):
            # 设置响应头,告诉浏览器这是Excel文件
            self.set_header('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
            self.set_header('Content-Disposition', 'attachment; filename="导出的数据.xlsx"')
            # 读取文件并发送给客户端
            with open(file_path, 'rb') as f:
                self.write(f.read())
        else:
            self.set_status(404)
            self.write("导出文件不存在,请重试")

def main():
    # 创建Bokeh应用
    app = Application(FunctionHandler(make_doc))
    # 启动服务器,允许远程访问
    server = Server({'/': app}, port=5006, allow_websocket_origin=['*'])
    
    # 添加自定义下载路由
    server._tornado.add_handlers(r'.*', [
        (r'/download', DownloadHandler),
    ])
    
    server.start()
    print(f"服务器运行在 http://你的服务器IP:5006")
    server.io_loop.start()

if __name__ == '__main__':
    main()

2. 启动服务器

直接运行python main.py就行,不用额外加参数,因为我们已经在代码里配置了允许远程访问。


注意事项

  • 确保服务器上安装了openpyxl(导出Excel需要的库),可以用pip install openpyxl安装
  • 如果是远程访问,要保证服务器的5006端口开放,Firefox能正常连接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:06:08