1
我有一个包含CSV数据的巨大字符串。我想将其转换为Excel文件(.xslx)并将其保存为UploadedFile
/SimpleUploadedFile
。我尽可能地使用Google搜索,并提出以下建议。很显然,它是巨大的字符串。将自己生成的Excel文件保存为UploadedFile
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_data.read()
如result_data
,result_file
,result_file.read()
,但到目前为止它们都没有工作。
编辑:我修改了我的代码根据jmcnamara的建议,但从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'
您得到的错误是由于Python 2和Python 3之间的差异造成的。对于Python 3,用'import io'和'output = io.BytesIO()'替换StringIO部分。 – jmcnamara
它的工作!我欠你一大笔感谢,先生! – makaveli