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