将自生成的Excel文件保存为UploadedFile

我有一个包含CSV数据的大string。 我想将其转换为Excel文件(.xslx)并将其保存为UploadedFile / SimpleUploadedFile 。 我尽可能地用Googlesearch,并提出以下build议。 result_data显然是巨大的string。

 from io import StringIO import pandas from django.core.files.uploadedfile import SimpleUploadedFile ### irrelevant code result_data = StringIO(result_data) df = pandas.DataFrame.from_csv(result_data, sep=';') writer = pandas.ExcelWriter('file.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1') result_file = writer.book result_data.seek(0) mimetype = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' object.xls_file = SimpleUploadedFile('filename.xlsx', result_data.read(), content_type=mimetype) object.save() 

我已经尝试了诸如result_dataresult_fileresult_file.read() result_data.read()类的result_data.read()无数replace,但到目前为止,他们都没有工作。

编辑:我修改我的代码根据jmcnamara的build议,但从writer.save()得到一个错误。

 output = StringIO() result_data = StringIO(result_data) df = pandas.DataFrame.from_csv(result_data, sep=';') writer = pandas.ExcelWriter(output, engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1') writer.save() 

追溯:

 Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/venv/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line utility.execute() File "/venv/lib/python3.4/site-packages/django/core/management/__init__.py", line 330, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/venv/lib/python3.4/site-packages/django/core/management/base.py", line 390, in run_from_argv self.execute(*args, **cmd_options) File "/venv/lib/python3.4/site-packages/django/core/management/base.py", line 441, in execute output = self.handle(*args, **options) File "/commands/create.py", line 67, in handle writer.save() File "/venv/lib/python3.4/site-packages/pandas/io/excel.py", line 1413, in save return self.book.close() File "/venv/lib/python3.4/site-packages/xlsxwriter/workbook.py", line 296, in close self._store_workbook() File "/venv/lib/python3.4/site-packages/xlsxwriter/workbook.py", line 541, in _store_workbook xlsx_file.write(os_filename, xml_filename) File "/usr/lib/python3.4/zipfile.py", line 1373, in write self.fp.write(zinfo.FileHeader(zip64)) TypeError: string argument expected, got 'bytes' Exception ignored in: <bound method ZipFile.__del__ of <zipfile.ZipFile object at 0x7fe5fa2077f0>> Traceback (most recent call last): File "/usr/lib/python3.4/zipfile.py", line 1466, in __del__ self.close() File "/usr/lib/python3.4/zipfile.py", line 1573, in close self.fp.write(endrec) TypeError: string argument expected, got 'bytes' 

在尝试读取数据之前,您可能需要closures/保存由pandas创build的xlsx文件:

 writer.save() 

另外,对于Pandas 0.17+,您可以使用StringIO / BytesIO对象作为pd.ExcelWriter的文件句柄。 例如:

 import pandas as pd import StringIO output = StringIO.StringIO() # Use the StringIO object as the filehandle. writer = pd.ExcelWriter(output, engine='xlsxwriter') # Write the data frame to the StringIO object. pd.DataFrame().to_excel(writer, sheet_name='Sheet1') writer.save() xlsx_data = output.getvalue() # Do something with the data...