Задать вопрос
@Atroshchenko-Dima
Python, postgres

Как реализовать скачивание таблицы в формате xlsx с web интерфейса?

При нажатии на кнопку скачать, происходит скачивание пустого excel файла. Попробовал два варианта, в обоих случаях одно и тоже. Подскажите, пожалуйста, в чем ошибка. Как нужно исправить код.

Ссылка на скачивание
<a href = "{{url_for('download', columns = request.form.getlist('columns'), year = request.form.getlist('year'), indicators=request.form.getlist('indicators'), station=request.form.getlist('station'))}}" class="btn btn-primary">Скачать</a>


app.py

@app.route("/download", methods=["GET","POST"])
def download():
    if request.method == "GET":
        # Получение переменных выбранных пользователем и обработка массива для select multiple
        year = [int(i) for i in request.form.getlist("year") if i.isdigit()]
        station = [str(i) for i in request.form.getlist("station")]
        indicators = [str(i) for i in request.form.getlist("indicators")]
        columns = [str(i) for i in request.form.getlist("columns")]
        # Запрос к БД с использованием параметров переменных
        cur = conn.cursor()
        cur.execute("SELECT {} FROM fact_indicators WHERE fact_year = ANY(%s) AND fact_indicators = ANY(%s) AND fact_station_name = ANY(%s);"
                    .format(",".join(["\"{}\"".format(c) for c in columns])),(year, indicators, station))
        rows = cur.fetchall()
        cur.close
        file_obj = io.BytesIO()
        # создаем новую книгу excel
        workbook = openpyxl.Workbook()
        worksheet = workbook.active
        worksheet.append(columns)
        for row in rows:
            worksheet.append(list(row))           
        workbook.save(file_obj)
        file_obj.seek(0)
        filename = "fact_T2.xlsx"
        response = make_response(file_obj.read())
        response.headers["Content-Disposition"] = f"attachment; path={filename}"
        response.headers["Content-Type"] = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        return response
    else:
        return redirect(url_for("index"))


app.py вариант 2
@app.route("/download", methods=["GET","POST"])
def download():
    if request.method == "GET":
        # Получение переменных выбранных пользователем и обработка массива для select multiple
        year = request.form.getlist("year")
        year = [int(i) for i in request.form.getlist("year") if i.isdigit()]
        station = request.form.getlist("station")
        station = [str(i) for i in request.form.getlist("station")]
        indicators = request.form.getlist("indicators")
        indicators = [str(i) for i in request.form.getlist("indicators")]
        columns = request.form.getlist("columns")
        columns = [str(i) for i in request.form.getlist("columns")]
        # Запрос к БД с использованием параметров переменных
        cur = conn.cursor()
        cur.execute("SELECT {} FROM fact_indicators WHERE fact_year = ANY(%s) AND fact_indicators = ANY(%s) AND fact_station_name = ANY(%s);"
                    .format(",".join(["\"{}\"".format(c) for c in columns])),(year, indicators, station))
        rows = cur.fetchall()
        cur.close
        # Имя скачавшегося файла
        filename = "fact_T2.xlsx"
        # Путь файла(выбран стандартный, downloads)
        filepath = os.path.join(os.path.dirname(__file__), filename)
        # создаем новую книгу excel
        workbook = openpyxl.Workbook()
        # Получаем активный лист
        worksheet = workbook.active
        # Заполняем таблицу данными из запроса к базе данных
        worksheet.append(columns)
        for row in rows:
            worksheet.append(list(row))           
        # Сохраняем результат в файл
        workbook.save(filepath)
        # Возвращаем файл на скачивание в папку downloads
        return send_from_directory(os.path.dirname(__file__),  path=filename, as_attachment=True)
    else:
        return redirect(url_for("index"))


На самом сайте таблицы выгружается корректно, printы для years, station, indicators, columns выглядят так(везде используется select multiple)
[2020, 2021, 2022]
['челябинск', 'тюмень']
['Выработка электроэнергии -всего']
['fact_year', 'fact_station_name', 'fact_q1', 'fact_q2', 'fact_q3', 'fact_q4', 'fact_annual_values']


В терминале вижу это
"GET /download?columns=fact_year&columns=fact_station_name&columns=fact_q1&columns=fact_q2&columns=fact_q3&columns=fact_q4&columns=fact_annual_values&year=2020&year=2021&year=2022&indicators=Выработка+электроэнергии+-всего&station=челябинск&station=тюмень HTTP/1.1" 200
  • Вопрос задан
  • 60 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы