Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generating word docs with Flask?

I'm trying to spin up a single page flask application that allows users to download a word document. I've already figured out how to make/save the document using python-docx, but now I need to make the document available in the response. Any ideas?

Here's what I have so far:

from flask import Flask, render_template
from docx import Document
from cStringIO import StringIO

@app.route('/')
def index():
    document = Document()
    document.add_heading("Sample Press Release", 0)
    f = StringIO()
    document.save(f)
    length = f.tell()
    f.seek(0)
    return render_template('index.html')
like image 920
BarFooBar Avatar asked Sep 18 '25 18:09

BarFooBar


2 Answers

instead of render_template('index.html') you can just:

from flask import Flask, render_template, send_file
from docx import Document
from cStringIO import StringIO

@app.route('/')
def index():
    document = Document()
    document.add_heading("Sample Press Release", 0)
    f = StringIO()
    document.save(f)
    length = f.tell()
    f.seek(0)
    return send_file(f, as_attachment=True, attachment_filename='report.doc')
like image 141
Doobeh Avatar answered Sep 20 '25 08:09

Doobeh


For those who pass after me...

referring to these two links:

  • python 3.x ImportError: No module named 'cStringIO' [StackOverFlow Question]
  • TypeError: string argument expected, got 'bytes' [GitHub issue]

io.StringIO now replaces cStringIO.StringIO

also it will raise an error as document.save(f) should receive a path or binary file

code should be like this:

from flask import Flask, render_template, send_file
from docx import Document
from io import BytesIO

@app.route('/')
def index():
    document = Document()
    f = BytesIO()
    # do staff with document
    document.save(f)
    f.seek(0)

    return send_file(
        f,
        as_attachment=True,
        # Use attachment_name for Flask version < 2.2.0
        download_name='report.docx'
    )

like image 32
Abd-Elaziz Sharaf Avatar answered Sep 20 '25 08:09

Abd-Elaziz Sharaf