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

生成的Excel文件结果

经验分享 程序员 微信小程序 职场和发展