2013-03-26 17 views
7

jestem przyzwyczajony do tworzenia arkuszy kalkulacyjnych w następujący sposób:xlwt napisać arkusz excel w locie

wbk = xlwt.Workbook() 
    earnings_tab = wbk.add_sheet('EARNINGS') 
    wbk.save(filepath) 

Czy istnieje jakiś sposób, aby nie zapisywać do pliku na ścieżkę np i zamiast pisać na przeprowadzenie polecić użytkownikowi, który ściąga plik? Czy muszę zapisać go jako plik tmp, a następnie udostępnić go użytkownikowi?

+0

użytkowników Django: Można zapisać do httpResponse. – Havvy

Odpowiedz

13

Cytując the documentation for the .save() method of xlwt:

To może być również przedmiotem strumień z metodą zapisu, takich jak StringIO, w którym to przypadku dane do pliku programu Excel jest napisane do strumienia .

Zmodyfikowany przykład:

import StringIO 

f = StringIO.StringIO() # create a file-like object 

wbk = xlwt.Workbook() 
earnings_tab = wbk.add_sheet('EARNINGS') 

wbk.save(f) # write to stdout 

Niektórzy mogą sugerować użyć cStringIO zamiast StringIO, ale być uprzedzony, że cStringIO kiedy ostatnio sprawdziłem nie prawidłowo obsługiwać Unicode.

Warto również zauważyć, że StringIO został zastąpiony w Pythonie 3 przez io.

+0

Musisz dodać io.seek (0), jeśli chcesz przeczytać (io.read()) z pliku jak obiekt. –

7

to co ja używać w Django:

response = HttpResponse(content_type='application/vnd.ms-excel') 
response['Content-Disposition'] = 'attachment; filename=file.xls' 
book.save(response) 
return response 
0
class QueryToExcel(object): 
def __init__(self, doc_name = 'doc_name'): 
    #some set up stuff 
    self.b_io = BytesIO() 
    self.workbook = pd.ExcelWriter(self.b_io, engine='xlsxwriter') 
    self.run() #fill in workbook with pandas dataframes 
    self.workbook.save() 

def get_workbook(self): 
    return self.b_io.getvalue() 


app = Flask(__name__) 
app.debug = True 
@app.route('/pvh/', methods = ['GET']) 
def get_workbook(self): 
    return self.b_io.getvalue() 
Powiązane problemy