2014-11-21 2 views
7

Я пытаюсь создать и обслуживать файлы excel с помощью Django. У меня есть файл jar, который получает параметры и создает файл excel в соответствии с параметрами, и он работает без проблем. Но когда я пытаюсь получить созданный файл и подавать его пользователю для загрузки, файл выходит нарушенным. Он имеет размер 0 КБ. Это часть кода, которую я использую для генерации и обслуживания Excel.Выполнение файла Excel (xlsx) пользователю для загрузки в Django (Python)

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"})) 

Я искал возможные решения и попытался использовать File Wrapper, но результат не изменился. Я предполагаю, что у меня проблема с чтением xlsx-файла в StringIO-объект. Но не знаю, как это исправить.

ответ

3

В дополнение к тому, что говорит Бруно, вы, вероятно, нужно открыть файл в двоичном режиме:

excel = open("%s_Report.xlsx" % id, "rb") 
6

Почему вы передаете содержимое своего файла 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 

Теперь вы можете проверить weither вы на самом деле было любое содержание в файле - тот факт, что существует файл не означает, что она не имеет ничего в нем. Помните, что вы находитесь в параллельном контексте, у вас может быть один поток или процесс, пытающийся прочитать файл, в то время как другой (=> другой запрос) пытается его написать.

+0

благодарит за ваш ответ. Проблема не в чтении файла в двоичном режиме, но я также обновил свой код, используя ваши отзывы. Надеюсь, это выглядит лучше :) http://pastebin.com/ydzR2uuP – Srht

+0

SO не место для просмотра кода (вы можете проверить codereview.stackexchange.com), но вот ответ http://pastebin.com/ e4zRAW5U –

Смежные вопросы