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文件