2016-03-01 28 views
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_dataresult_fileresult_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' 

回答

1

你可能需要尝试读取数据之前关闭/保存由大熊猫创建的XLSX文件:

writer.save() 

而且,与熊猫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... 
+0

您得到的错误是由于Python 2和Python 3之间的差异造成的。对于Python 3,用'import io'和'output = io.BytesIO()'替换StringIO部分。 – jmcnamara

+0

它的工作!我欠你一大笔感谢,先生! – makaveli

相关问题