2013-03-26 3 views
7

Я привык к созданию таблицы следующим образом:xlwt писать Excel лист на лету

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

Есть ли способ, чтобы не сохранить файл в FilePath, и вместо того, чтобы писать на в- летать пользователю, который загружает файл? Или мне нужно сохранить его как файл tmp, а затем передать его пользователю?

+0

пользователи Джанго: Вы можете сохранить HTTPResponse. – Havvy

ответ

13

Процитирует the documentation for the .save() method of xlwt:

Она также может быть поток объектом с помощью метода записи, таких как StringIO, в этом случае данные для файла первенствуйте записываются в поток.

Модифицированный пример:

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 

Некоторые могут предложить вам использовать cStringIO вместо StringIO, но предупреждаю, что cStringIO когда последний я проверил не правильно обрабатывать Unicode.

Возможно, стоит отметить, что StringIO заменен на Python 3 на io.

+0

Вам нужно добавить io.seek (0), если вы хотите прочитать (io.read()) из файла, подобного объекту. –

7

это то, что я использую в 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() 
Смежные вопросы