2012-09-05 13 views
6

Stavo usando lo stackoverflow da un po 'e mi ha aiutato molto spesso. Ora ho un problema che non potevo risolvere da solo o attraverso la ricerca. Sto provando ad emettere il mio file excel generato da openpyxl nel browser mentre lo stavo facendo con phpexcel. Il metodo sembra essere lo stesso, ma ho solo un file rotto. Il mio codice è simile al seguente:come generare xlsx generato da Openpyxl nel browser?

from openpyxl.workbook import Workbook 
from openpyxl.writer.excel import ExcelWriter 
from openpyxl.writer.excel import save_virtual_workbook 
from openpyxl.cell import get_column_letter 
from StringIO import StringIO 

print 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
print 'Content-Disposition: attachment;filename="results.xlsx"' 
print 'Cache-Control: max-age=0\n' 

output = StringIO() 

wb = Workbook() 

ws = wb.worksheets[0] 

ws.cell('A1').value = 3.14 

wb.save(output) 
print output.getvalue() 
#print save_virtual_workbook(wb) 

Io uso la versione 1.5.8 e python 2.7. Nessuno degli approcci funziona. Quando lo uso da desktop e non da browser, funziona perfettamente. Sarei molto grato per l'aiuto.

P.S. per favore non dirmi che usare un'altra lingua o un programma sarebbe più facile. Ho bisogno di risolvere questo con Python.

+0

Da questa domanda, presumo che non abbiate esperienze sulla programmazione web in Python. Non è possibile inserire un codice all'interno di un * .py nella root del documento e aspettarsi che venga eseguito come * .php. – Dikei

+0

Le intestazioni Contenuto- * sembrano imperfette. Dovrebbero usare terminazioni di linea CR/LF. Puoi ottenere un semplice esempio di 'text/html' pubblicato correttamente da questo script? Se no, aggiustalo per primo. – tripleee

+0

Ho abbastanza esperienza per sapere come eseguirlo da cgi-bin. Ho altri script in esecuzione. Questo è il primo che non emette ciò di cui ho bisogno. Sì clean text/html funziona perfettamente, almeno per quanto ho provato. Non vedo perché dovrei usare CR/LF ... – seeebek

risposta

-5

Se si desidera creare una tabella HTML simile al foglio di calcolo, è probabile che si desideri lavorare con CSV. O fai questo, invece di Excel, O converti il ​​tuo Excel in CSV dopo averlo creato.

In ogni caso, una volta che hai i dati in formato CSV, quindi è semplicemente una questione di usare Python per costruire la pagina HTML e scorrendo i dati CSV, mentre inserendo i vostri <table>, <tr> e <td> tag, a seconda dei casi .

+0

Sì, non ho molta esperienza con la programmazione web in python. My mork è di tradurre alcune di questo tipo di app da php a python e ora sono bloccato con phppyton -> openpyxl. Ho bisogno dello stesso comportamento. che sta ricevendo i dati da un altro script, inviandolo a questo script inserendolo nel file excel e trasmettendolo come download al browser. Forse senza prima salvarlo sul server. – seeebek

+0

@David la domanda riguarda specificamente la pubblicazione di un file Excel. –

0

Gli script funzionano per me come ci si aspetta senza modifiche.

Posso solo presumere che tu abbia un problema con l'impostazione dello script cgi.

Assicurarsi di avere la directory in cui lo script attualmente viene servito dal server web. Su Apache si può raggiungere questo obiettivo con:

ScriptAlias /cgi-bin/ /home/WWW/localhost/cgi-bin/ 

Assicurarsi che la sceneggiatura è excutable impostando i permessi di script. Per l'operazione a riga di comando (python scriptname) che non era necessaria, per il tuo browser che è. E assicurati che il proprietario del server web possa escludere gli script, poiché probabilmente il server web non funziona come te.

1

Scrivere l'output xlsx su disco e quindi servirlo via Apache ha funzionato perfettamente, ma la sua uscita causava direttamente errori in Excel e altri problemi.

ho aggiunto un paio di passaggi in più e ha fatto una piccola modifica al codice:

buffer=output.getvalue() 

nelle intestazioni HTTP:

print "Content-Length: " + str(len(buffer)) 

e utilizzato write() invece di print() per spingere il tampone in il flusso di output standard:

stdout.write(buffer) 
+0

+1 per includere l'intestazione 'Content-Length'. Non potrei farlo funzionare senza. Quando ho usato 'print save_virtual_workbook (wb)', il mio file zippato risultante aveva due byte extra. Se ho usato 'stdout.write()' aveva un byte in più. Fornire "Content-Length" lo ha risolto. – Auspex

5

questo è lavoro per me. Io uso python 2.7 e ultima openpyxl e send_file dalla boccetta

... code ... 

import StringIO 
from openpyxl import Workbook 
wb = Workbook() 
ws = wb.active # worksheet 
ws.title = "Excel Using Openpyxl" 
c = ws.cell(row=5, column=5) 
c.value = "Hi on 5,5" 
out = StringIO.StringIO() 
wb.save(out) 
out.seek(0) 

return send_file(out, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 
      attachment_filename='xxl.xlsx', as_attachment=True) 
+2

Questo è terribile aliasing! 'da io import BytesIO' è il modo per farlo. –

0

Perché Excel utilizza un formato binario si dovrebbe usare BytesIO al buffer.

from io import BytesIO

Ma che errore state ottenendo, se si utilizza save_virtual_workbook() che fa questo per voi?

2
output = HttpResponse(mimetype='application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 
file_name = "Test.xlsx" 
output['Content-Disposition'] = 'attachment; filename='+ file_name 

wb = Workbook() 

ws = wb.worksheets[0] 

ws.cell('A1').value = 3.14 

wb.save(output) 

return output 

Ho usato questi suggerimenti per scaricare i miei file con openpyxl. Spero che questo possa aiutare

Problemi correlati