python3 xlsxwiter模块插入matplotlib保存到io.BytesIO中的图
解决问题
1、xlsxwriter生成excel文件的基础函数;
2、matplotlib生成的图存入io.BytesIO字节流中;
3、xlsxwriter插入存在io.BytesIO中的图对象
代码示例
import pandas as pd
import xlsxwriter
import matplotlib.pyplot as plt
from io import BytesIO
df = pd.DataFrame({'col1':[1,2,3],'col2':[4,5,6],'这个列名真的好长长长啊':[7,8,9]})
imgdata = []
imgdata.append(BytesIO())
fig,ax = plt.subplots(figsize=(9,6)) #图片高度为6英寸,1英寸=2.54cm
plt.plot(df.col1,df.col2,'ro-')
plt.savefig(imgdata[-1]) #将matplotlib生成的fig存入BytesIO中,无需存到本地
workbook = xlsxwriter.Workbook('test.xlsx') #初始化workbook
fmt1 = workbook.add_format({'align':'center','valign':'vcenter','text_wrap':True,'font_size':15,
'bg_color':'silver','font_color':'black','bold':True})
fmt2 = workbook.add_format({'align':'center','valign':'vcenter','text_wrap':True,'font_size':10,
'bg_color':'gray','font_color':'black'})
#align:水平对齐方式,valign:垂直对齐方式,text_wrap:自动换行,font_size:字体大小,bg_color:背景颜色
#font_color:字体颜色,bold:字体加粗
worksheet1 = workbook.add_worksheet('sheet1') #增加worksheet
worksheet1.write_row('A1',df.columns.tolist()) #写入行数据
for i in range(df.shape[0]):
worksheet1.write_row(i+1,0,df.iloc[i,:])
worksheet1.set_column(0,2,width=17) #设置列格式
worksheet1.set_row(row=0,height=40,cell_format=fmt1) #设置行格式
worksheet1.freeze_panes(1,0) #冻结第一行
for i in range(1,4):
worksheet1.set_row(row=i,height=25,cell_format=fmt2)
worksheet1.insert_image(6,0,'',{'image_data':imgdata[-1],'x_scale':1/1.1,'y_scale':1/0.93})
#insert_image(row,col,image,options)
#row:int行索引,col:int列索引,image:string图片文件名(含路径)
#options:dict
# {
# 'x_offset': 0, 水平方向偏移像素值
# 'y_offset': 0, 垂直方向偏移像素值
# 'x_scale': 1, 水平方向缩放比例
# 'y_scale': 1, 垂直方向缩放比例
# 'url': None,
# 'tip': None,
# 'image_data': None, 在io.BytesIO中添加内存中的字节流
# 'positioning': 2, 控制图片对象位置
# }
workbook.close() #保存出xlsx文件