我可以将一个StringIO对象传递给pd.to_csv(),很好:
io = StringIO.StringIO()
pd.DataFrame().to_csv(io)但是当使用excel作者时,我遇到了更多的麻烦。
io = StringIO.StringIO()
writer = pd.ExcelWriter(io)
pd.DataFrame().to_excel(writer,"sheet name")
writer.save() 返回
AttributeError: StringIO instance has no attribute 'rfind'我试图在不调用ExcelWriter的情况下创建一个pd.ExcelWriter()对象,但遇到了一些问题。这就是我迄今为止尝试过的:
from xlsxwriter.workbook import Workbook
writer = Workbook(io)
pd.DataFrame().to_excel(writer,"sheet name")
writer.save()但现在我得到了一个AttributeError: 'Workbook' object has no attribute 'write_cells'
如何将熊猫数据以excel格式保存到StringIO对象?
发布于 2015-01-21 11:03:14
虽然每个编写引擎都支持ExcelWriter构造函数,但是熊猫希望有一个文件名路径。也许这应该作为Pandas中的一个bug/特性请求来提出。
同时,这里有一个使用Pandas xlsxwriter引擎的解决方案:
import pandas as pd
import StringIO
io = StringIO.StringIO()
# Use a temp filename to keep pandas happy.
writer = pd.ExcelWriter('temp.xlsx', engine='xlsxwriter')
# Set the filename/file handle in the xlsxwriter.workbook object.
writer.book.filename = io
# Write the data frame to the StringIO object.
pd.DataFrame().to_excel(writer, sheet_name='Sheet1')
writer.save()
xlsx_data = io.getvalue()更新:从Pandas0.17开始,现在可以更直接地这样做了:
# Note, Python 2 example. For Python 3 use: output = io.BytesIO().
output = StringIO.StringIO()
# Use the StringIO object as the filehandle.
writer = pd.ExcelWriter(output, engine='xlsxwriter')还请参阅将Dataframe输出保存为字符串文档中的XlsxWriter。
发布于 2020-12-15 21:30:50
这些都不是我干的。我有一个视图,我想从Django返回一个excel工作簿。我找到了我的解决方案从熊猫的文件里。
import io
bio = io.BytesIO()
writer = pd.ExcelWriter(bio, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
writer.save()
bio.seek(0)
# BONUS CONTENT
# .. because I wanted to return from an api
response = HttpResponse(bio, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename=myfile.xlsx'
return response # returned from a view here注意,我使用该值作为内容类型,因为根据mozzilla文档,它是mime类型。来自以下链接中的".xlsx“。视需要更换。类型
发布于 2015-01-21 04:59:45
如果您不介意使用xlwt作为您的作者,那么浏览pandas.io.excel源代码看起来应该不会有太大问题。其他引擎也可能没有那么困难,但是xlwt跳出来很容易,因为它的保存方法需要流或文件路径。
您需要首先传入一个文件名,以使熊猫高兴,因为它检查文件名扩展名与引擎,以确保它是一个受支持的格式。但是对于xlwt引擎,它只是将文件名填充到对象的path属性中,然后在save方法中使用它。如果将path属性更改为流,则在调用save方法时,它将很高兴地保存到该流。
下面是一个例子:
import pandas as pd
import StringIO
import base64
df = pd.DataFrame.from_csv('http://moz.com/top500/domains/csv')
xlwt_writer = pd.io.excel.get_writer('xlwt')
my_writer = xlwt_writer('whatever.xls') #make pandas happy
xl_out = StringIO.StringIO()
my_writer.path = xl_out
df.to_excel(my_writer)
my_writer.save()
print base64.b64encode(xl_out.getvalue())这是一种快速、简单和略带污点的方法。顺便说一句。一种更简洁的方法是子类ExcelWriter (或者它的一个现有子类,例如_XlwtWriter) --但老实说,更新path属性几乎没有什么关系,我投票给您看的是简单的方法,而不是稍微长一些的路径。
https://stackoverflow.com/questions/28058563
复制相似问题