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

