Подача файла Excel (xlsx) пользователю для загрузки в Django (Python)
Я пытаюсь создавать и обслуживать файлы excel с помощью Django. У меня есть файл jar, который получает параметры и создает файл excel в соответствии с параметрами, и он работает без проблем. Но когда я пытаюсь получить полученный файл и передать его пользователю для загрузки, файл выходит сломанным. Он имеет размер 0 КБ. Это фрагмент кода, который я использую для генерации и обслуживания excel.
def generateExcel(request,id):
if os.path.exists('./%s_Report.xlsx' % id):
excel = open("%s_Report.xlsx" % id, "r")
output = StringIO.StringIO(excel.read())
out_content = output.getvalue()
output.close()
response = HttpResponse(out_content,content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename=%s_Report.xlsx' % id
return response
else:
args = ['ServerExcel.jar', id]
result = jarWrapper(*args) # this creates the excel file with no problem
if result:
excel = open("%s_Report.xlsx" % id, "r")
output = StringIO.StringIO(excel.read())
out_content = output.getvalue()
output.close()
response = HttpResponse(out_content,content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename=%s_Report.xlsx' % id
return response
else:
return HttpResponse(json.dumps({"no":"excel","no one": "cries"}))
Я искал возможные решения и пытался использовать обертку файла, но результат ничего не изменилось. Я предполагаю, что у меня проблема с чтением файла xlsx в объект StringIO. Но не имею ни малейшего представления о том, как это исправить
3 ответов
В дополнение к тому, что говорит Бруно, вы, вероятно, нужно открыть файл в двоичном режиме:
excel = open("%s_Report.xlsx" % id, "rb")
Почему вы передаете содержимое своего файла в StringIO
просто назначить StringIO.get_value()
к локальной переменной ? Что случилось с присвоение file.read()
к переменной напрямую ?
def generateExcel(request,id):
path = './%s_Report.xlsx' % id # this should live elsewhere, definitely
if os.path.exists(path):
with open(path, "r") as excel:
data = excel.read()
response = HttpResponse(data,content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename=%s_Report.xlsx' % id
return response
else:
# quite some duplication to fix down there
теперь вы можете проверить, действительно ли у вас было какое - либо содержимое в вашем файле-тот факт, что файл существует, не означает, что в нем что-то есть. Помните, что вы находитесь в параллельном контексте, вы можете иметь один поток или процесс, пытающийся прочитать файл, в то время как другой (=>другой запрос) пытаюсь написать.
вы можете использовать эту библиотеку для создания листов excel на лету. http://xlsxwriter.readthedocs.io/
для получения дополнительной информации см. эту страницу. Благодаря @alexcxe
объект XlsxWriter сохранить как http-ответ для создания загрузки в Django