Форум программистов, компьютерный форум, киберфорум
Python: Flask
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 09.09.2022
Сообщений: 53

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

24.05.2023, 07:52. Показов 1796. Ответов 0
Метки нет (Все метки)

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

Ссылка на скачивание
Code
1
<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

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@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

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@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)
Code
1
2
3
4
[2020, 2021, 2022]
['челябинск', 'тюмень']
['Выработка электроэнергии -всего']
['fact_year', 'fact_station_name', 'fact_q1', 'fact_q2', 'fact_q3', 'fact_q4', 'fact_annual_values']
В терминале вижу это

Code
1
"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
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.05.2023, 07:52
Ответы с готовыми решениями:

Вывод в формате xlsx
Скажите пожалуйста , где ошибка? Файл в операционку выводится с ошибкой, к коду матрицы нет вопросов, к выводу есть.... from random...

XLSX Как реализовать наиболее эффективный поиск по элементам столбца?
Доброго времени суток! Есть очень большой .xlsx файл (три столбца, +-75К строк). Как реализовать организовать наиболее эффективный...

VBA Excel Сохранение в формате xlsx
Возможно и как сохранить макрос и форму на писанные на VBA в формате документа xlsx, а не в xlsm. Встречал документы с макросами в...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2023, 07:52
Помогаю со студенческими работами здесь

Сохранить КОПИЮ файла в формате .xlsx
Как сохранить копию файла по определенном пути без макросов. Такой пример не удачный, так как файл .xlsx, который якобы сохранился, при...

Сохранение в файл в формате xlsx и docx
Всем привет. В общем я хочу узнать как можно в qt сохранить числа в формате файла xlsx и docx через ........ ...

Как реализовать скачивание
Здравствуйте, дан исходный код страницы, который записан в массив. В массиве найдены элементы удовлетворяюще требованиям. Как мне убрать...

Как реализовать скачивание с сайта?
Я хочу, что пользователи скачивали у меня с сайта файлы. Пожалуйста, кто может, подскажите главные функции в php, с помощью которых...

Как реализовать скачивание файла?
И второй вопрос: как правильнее сформулировать (обозвать) &quot;предоставление возможности скачать&quot;? Задание -- веб-приложение,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru