Найти - Пользователи
Полная версия: Экспорт таблицы в csv без создания файла на сервере
Начало » Web » Экспорт таблицы в csv без создания файла на сервере
1
tomahawk
Уважаемые, направьте меня в правильном направлении.
python+flask

Есть переменная data, где хранится результат запроса в БД.
Есть кнопка, которая запускает функция создания csv, который должен скачиваться сразу.

 @app.route("/export_to_csv")
def export_to_csv():
    try:
        output = io.StringIO()
        writer = csv.writer(output)
        line = ['Дата и время', 'Номер абонента', 'Номер оператора', 'Полная длительность', 'Длительность разговора',
                'Время ожидания', 'Внешний номер']
        writer.writerow(line)
        writer.writerow(line)
        for row in data:
            dataline = [str(row[0]) + ',' + row[1] + ',' + row[2] + ',' + str(row[3]) + ',' + str(row[4]) + ',' + str(row[5]) + ',' + row[6]]
            writer.writerow(dataline)
        output.seek(0)
        output.truncate(0)
        response = Response(output, mimetype='text/csv')
        output.close()
        response.headers.set("Content-Disposition", "attachment", as_attachment=True, attachment_filename="log.csv")
        return response
    except Exception as e:
        print(e)
    finally:
        print('click')
Ошибок нет, но и файла тоже
py.user.next
Ряд неправильно формируешь перед записью
  
dataline = [str(row[0]), row[1], row[2], str(row[3]), str(row[4]), str(row[5]), row[6]]

Убери строку с truncate(0).
tomahawk
Спасибо!
Но ничего не изменилось.
PyCharm вываливает в консоль:

127.0.0.1 - - “POST /report1 HTTP/1.1” 200 -
click

и все. Файла нет

Я правильно понимаю, что этот код должен генерировать файл и сохранять его на стороне клиента?
py.user.next
Пример генерации данных и передачи их как файла
  
import io
import csv
 
from flask import Flask
 
app = Flask(__name__)
 
@app.route('/')
def hello():
    return 'Hello World!'
 
@app.route('/report')
def report():
    ofname = 'file.csv'
 
    data_stream = io.StringIO()
    writer = csv.writer(data_stream)
    writer.writerow(['Field1', 'Field2', 'Field3'])
    writer.writerow(['a1', 'b1', 'c1'])
    writer.writerow(['a2', 'b2', 'c2'])
    writer.writerow(['a3', 'b3', 'c3'])
 
    data_stream.seek(0)
    data = data_stream.read()
    datalen = len(data)
    headers = {
        'Content-Disposition': 'attachment; filename={}'.format(ofname),
        'Content-Length': str(datalen),
        'Content-Type': 'text/csv; charset=utf-8'
    }
    response = (data, headers)
    return response


tags: flask file
tomahawk
Спасибо, нашел такое решение - работает!
 def export_to_csv():
    si = io.StringIO()
    cw = csv.writer(si)
    cw.writerows('csvList')
    output = make_response(si.getvalue())
    output.headers["Content-Disposition"] = "attachment; filename=export.csv"
    output.headers["Content-type"] = "text/csv"
    return output
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB