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

使用pptx与Python Dash生成下载PPT无幻灯片问题求助

问题:生成的PPTX文件无幻灯片内容

使用pptx库和Python Dash框架创建并下载PPTX演示文稿,文件可正常生成且无报错,但生成的演示文稿中未创建任何幻灯片。

原代码如下:

import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.exceptions import PreventUpdate
from dash.dependencies import Input, Output

from pptx import Presentation
import io

app = dash.Dash(__name__,external_stylesheets=[dbc.themes.BOOTSTRAP])

app.layout = html.Div([html.Button('Download Slides', id='download_button', n_clicks=0), dcc.Download(id='download')])

@app.callback(Output('download', 'data'), [Input('download_button', 'n_clicks')])
def download_file(n_clicks):
    if n_clicks == 0:
        raise PreventUpdate
    
    def to_pptx(bytes_io):
    
        prs = Presentation()
        title_slide_layout = prs.slide_layouts[0]
        slide = prs.slides.add_slide(title_slide_layout)
        title = slide.shapes.title            
        title.text = 'Hello, World!'

        filename = io.BytesIO() #io.StringIO()
        prs.save(filename)            
        filename.seek(0)

    return dcc.send_bytes(to_pptx, 'Slides.pptx')

if __name__ == '__main__':
    app.run_server(debug=True, use_reloader=False)
问题原因与修复

问题出在to_pptx函数的实现上:Dash的dcc.send_bytes会传入一个bytes_io对象,用于接收要下载的文件内容,但你的代码里自己创建了一个新的BytesIO对象并将PPT内容保存到其中,却没有把这个内容写入到Dash传入的bytes_io里,导致最终下载的文件是空的。

修复后的代码:

import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.exceptions import PreventUpdate
from dash.dependencies import Input, Output

from pptx import Presentation
import io

app = dash.Dash(__name__,external_stylesheets=[dbc.themes.BOOTSTRAP])

app.layout = html.Div([html.Button('Download Slides', id='download_button', n_clicks=0), dcc.Download(id='download')])

@app.callback(Output('download', 'data'), [Input('download_button', 'n_clicks')])
def download_file(n_clicks):
    if n_clicks == 0:
        raise PreventUpdate
    
    def to_pptx(bytes_io):
        prs = Presentation()
        title_slide_layout = prs.slide_layouts[0]
        slide = prs.slides.add_slide(title_slide_layout)
        title = slide.shapes.title            
        title.text = 'Hello, World!'

        # 直接使用Dash传入的bytes_io保存PPT内容
        prs.save(bytes_io)            
        bytes_io.seek(0)

    return dcc.send_bytes(to_pptx, 'Slides.pptx')

if __name__ == '__main__':
    app.run_server(debug=True, use_reloader=False)

核心修改点:

  • 删除自行创建的filename = io.BytesIO()
  • 将prs.save(filename)改为prs.save(bytes_io)
  • 将filename.seek(0)改为bytes_io.seek(0)

这样PPT内容会被正确写入到Dash用于下载的字节流中,下载的文件就能包含创建的幻灯片了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:05:17