2014-12-03 3 views
0

Я использую инструмент pandas для создания загружаемого файла excel. Excel получит его из таблицы SQL, которая, в свою очередь, будет заполнена в зависимости от значений, введенных пользователем. Я добавил одну кнопку загрузки в моя веб-страница для загрузки Excel.Django: python pandas generate blank excel

При нажатии кнопки загрузки создается пустой файл excel с именем листа и именем файла как Отчет о непротиворечивости. Может кто-нибудь указать, что я делаю неправильно здесь.

Заранее спасибо

views.py

def export_excel(request): 
response = HttpResponse(content_type="application/vnd.ms-excel") 
response['Content-Disposition'] = 'attachment; filename=Consistency Report.xls' 
fname = 'Consistency Report.xls' 
cnxn = pyodbc.connect('DRIVER={SQL Server Native Client 10.0};SERVER=******;DATABASE=testing;UID=***;PWD=******') 
cursor = cnxn.cursor() 
cursor.execute("select * from dhm_consis_report_tbl") 
columns = [column[0] for column in cursor.description] 
data=cursor.fetchall() 
cursor.commit() 
print(columns) 
for i in range(0,len(data)): 
    data[i]=tuple(data[i]) 
df = ps.DataFrame(data=data,columns=columns) 
writer = ps.ExcelWriter('Consistency Report.xls',engine='xlwt') 
df.to_excel(writer,sheet_name='Report') 
writer.save() 

return response 

Итак, я отредактировал мой views.py и я в состоянии генерировать и скачать Excel файл, но проблема в том, что теперь файл загрузки в двух местах; один в моей папке проекта и один в моей папке загрузки. Также файл в папке загрузки пуст, а тот, что находится в моей папке проекта, содержит данные. Может кто-нибудь объяснить, почему это происходит?

Модифицированный views.py

def export_excel(request): 

response = HttpResponse(content_type="application/vnd.ms-excel;charset=utf-8") 
response['Content-Disposition'] = 'attachment; filename=Consistency Report.xls' 
df = ps.DataFrame.from_records(DHM_Consis_Report.objects.values('conquery_source','conquery_name','conquery_count','conquery_desc','criticality','sp_status','con_rundate','instance_id')) 
print(df) 
writer = ps.ExcelWriter('Consistency Report.xls',encoding='utf-8') 
df.to_excel(writer,sheet_name='Report') 
writer.save() 
return response 
+0

В основном вам нужно отправить сгенерированный файл «непротиворечивость Report.xls», вы можете сделать это, прочитав его в тело ответа сервлета или с использованием другой альтернативы, как SendFile или файловый обмен. – Rolando

+0

@Rho Можете ли вы объяснить, как это сделать. Django noob, поэтому любая помощь высоко ценится. – Prav001

+0

Я думаю, что одним быстрым и грязным способом может быть: 'response.content = open (« Consistency Report.xls »)' непосредственно перед 'return response'. Но это предполагает, что ваш файл достаточно мал, чтобы вписаться в память. – Rolando

ответ

0

Наконец, я был в состоянии произвести необходимый excel.Earlier я создавал и писать Excel с данными, но мой HttpResponse не получал требуемое data.I поставить логика относительно генерации excel в отдельной функции и логике относительно загрузки сгенерированного файла в отдельной функции. Это то, что я сделал.

Я знаю, что это грубо и неэффективно, но это работает для меня. Если у кого-то есть лучший способ сделать это, пожалуйста, поделитесь.

views.py

@login_required 
def consisreports(request): 
    cust= customername 
    username=None 
    if request.user.is_authenticated(): 
     username=request.user.username 
    print(username)  
    table=ConsisReport(DHM_Consis_Report.objects.all()) 
    RequestConfig(request,paginate={"per_page": 25}).configure(table) 
    todays=date.today() 
    todays=todays.strftime("%d-%m-%y") 
    filename="Consistency Report %s as on %s %s.xls"%(cust,str(todays),username) 
    colname=['Customer','Query ','Count','Desc','Criticality','Status','Rundate','Instance ID'] 
    df = ps.DataFrame.from_records(DHM_Consis_Report.objects.values('conquery_source','conquery_name','conquery_count','conquery_desc','criticality','sp_status','con_rundate','instance_id')) 
    df=df[['conquery_source','conquery_name','conquery_count','conquery_desc','criticality','sp_status','con_rundate','instance_id']] 
    print(df) 
    #df.save('C:/Users/P1097/Desktop') 
    writer = ps.ExcelWriter(filename) 
    df.to_excel(writer,sheet_name='Report',index=False,engine='xlsxwriter',header=colname) 
    writer.save() 
    return render(request, 'consistency/consresult.html', {'table': table,'customername':cust}) 


@login_required  
def export_excel(request): 
    custname=customername 
    username=None 
    if request.user.is_authenticated(): 
     username=request.user.username 
    todays=date.today() 
    todays=todays.strftime("%d-%m-%y") 
    filename="Consistency Report %s as on %s %s.xls"%(custname,str(todays),username) 
    wrapper=open(filename,"rb") 
    cont=wrapper.read() 
    response = HttpResponse(cont,content_type="application/vnd.ms-excel;charset=utf-8") 
    response['Content-Length']=os.path.getsize(filename) 
    size=os.path.getsize(filename) 
    print(size) 
    wrapper.close() 
    response['Content-Disposition'] = 'attachment; filename= %s'%filename 
    return response