前面分享了使用xlsxwriter创建excel和写入数据GUC:(原创)xlsxwriter,python excel 写入数据\图表等操作_创建、写入(一)
xlsxwrite除了常规数据操作,还可以灵活,精细的操作图表,这也为吸引我要分享的原因之一,对于固定格式报表可以自动输出,大大提升日常的办公效率
先用上一篇文章的方法写入数据
import xlsxwriter
wb = xlsxwriter.Workbook("e:\\xlsxwriter\\filename.xlsx")
ws = wb.add_worksheet("案例")
# 数据
data = [
('地区','1月销售量','2月销售量'),
('广州',52641,45641,),
('上海',65444,54584,),
('北京',57485,65484,),
('深圳',42314,85214,)
]
#字段格式
header = {
'bold' : True, #粗体
'font_name' : '微软雅黑',
'font_size' : 10,
'border' : True, #边框线
'align' : 'center', #水平居中
'valign' : 'vcenter', #垂直居中
'bg_color' : '#66DD00' #背景颜色
}
text = {
'font_name' : '微软雅黑',
'font_size' : 9,
'border' : True,
'align' : 'left', #左对齐
'valign' : 'vcenter'
}
headerpm = wb.add_format(header)
textpm = wb.add_format(text)
ws.set_column('C:C',13) #C列宽度
for row,rowdata in enumerate(data):
for col,coldata in enumerate(rowdata):
if row==0:
ws.write(row,col,coldata,headerpm)
else:
ws.write(row, col, coldata, textpm)
wb.close()
结果数据如下:
使用Workbook的add_chart()方法创建图表对象,以字典表的方式传入参数
chart = workbook.add_chart({'type': 'column'}) #创建一个柱状图
type表示要创建的图表类型,值及对应类型如下:area:面积图
bar:条形图
column:柱状图
line:折线图
pie:饼图
doughnut:圆环图
scatter:散点图
stock:股价图
radar:雷达图
使用add.series()数据系列添加的图表,以字典表的方式传入参数
data1 = {
'name': '案例!$B$1',
'categories' : '案例!$A$2:$A4',
'values' : '案例!$B$2:$B4'
}name:该数据系列的名称 ,可以填写引用单元格值,也可以直接填写值
categories:图表类别标签
values:该数据系列的值
values选项为必须,其他选项为可选
categories、values可以使用单元格的名称,也可以使用行/列索引表示,即[所在的sheet名, 首行索引, 首列索引, 尾行索引,尾列索引 ]
以下表示同上
data1 = {
'name': '1月销售量',
'categories' : ['案例',1,0,4,0],
'values' : ['案例',1,1,4,1]
}
图表中增加数据系列
chart.add_series(data1)
使用Worksheet的insert_chart()方法插入工作表中,需指定起始位置
ws.insert_chart('B8',chart) #在B10单位格位置插入图表
结果如下
再插入2月销售量数据系列
data1 = {
'name': '案例!$B$1',
'categories' : '案例!$A$2:$A4',
'values' : '案例!$B$2:$B4'
}
data2 = {
'name': '案例!$C$1',
'categories' : '案例!$A$2:$A4',
'values' : '案例!$C$2:$C4'
}
chart.add_series(data1)
chart.add_series(data2)
ws.insert_chart('B8',chart)
结果如下
再美化一下表格
'overlap' : -20
overlap:两个数据系列之间重叠的距离,范围+/-100,默认值为0,适用于条形图/柱状图
如下图红框的距离
'gap' : 100
gap:在条形图/柱形图中数据系列之间的间隔。范围是0-500。默认值是150
如下图红框的距离
'data_labels' : {'value':True,'font':{'name':'微软雅黑','size':9}}
添加数据标签,并设置数据标签的字体为微软雅黑,大小为9
如下图红框部分
设置X轴参数,斜体,大小10,加粗
chart.set_x_axis(
{
'num_font': {'italic': True,'size':11,'bold':True,}
}
)
结果见下图
设置Y轴参数,去除Y轴及背景网格线
chart.set_y_axis(
{
'major_gridlines':{'visible':False}, #去除Y轴背景网格线
'visible':None #去除Y轴
}
)
结果如下图
设置图表标题
chart.set_title(
{
'name':'1-2月销售量',
'name_font': {'name': '微软雅黑'}
}
)
结果如下图
设置图表大小,宽620,高350
chart.set_size({'width':620,'height':350})
结果如下图
sheet完整如下图
去掉图表边框
chart.set_chartarea({'border':{'none':True}})
结果如下图
隐藏工作表网格线
ws.hide_gridlines(2)
#参数0,不隐藏
#参数1,仅隐藏打印的网格线
#参数2,隐藏屏幕和打印的网格线
结果如下图
最后附上完整代码
import xlsxwriter
wb = xlsxwriter.Workbook("e:\\xlsxwriter\\filename.xlsx")
ws = wb.add_worksheet("案例")
# 数据
data = [
('地区','1月销售量','2月销售量'),
('广州',52641,45641,),
('上海',65444,54584,),
('北京',57485,65484,),
('深圳',42314,85214,)
]
#字段格式
header = {
'bold' : True, #粗体
'font_name' : '微软雅黑',
'font_size' : 10,
'border' : True, #边框线
'align' : 'center', #水平居中
'valign' : 'vcenter', #垂直居中
'bg_color' : '#66DD00' #背景颜色
}
text = {
'font_name' : '微软雅黑',
'font_size' : 9,
'border' : True,
'align' : 'left', #左对齐
'valign' : 'vcenter'
}
headerpm = wb.add_format(header)
textpm = wb.add_format(text)
ws.set_column('C:C',13) #C列宽度
for row,rowdata in enumerate(data):
for col,coldata in enumerate(rowdata):
if row==0:
ws.write(row,col,coldata,headerpm)
else:
ws.write(row, col, coldata, textpm)
chart = wb.add_chart({'type': 'column'})
data1 = {
'name': '案例!$B$1',
'categories' : '案例!$A$2:$A4',
'values' : '案例!$B$2:$B4',
'overlap' : -20,
'gap' : 100,
'data_labels' : {'value':True,'font':{'name':'微软雅黑','size':9}}
}
data2 = {
'name': '案例!$C$1',
'categories' : '案例!$A$2:$A4',
'values' : '案例!$C$2:$C4',
'data_labels': {'value': True, 'font': {'name': '微软雅黑', 'size': 9}}
}
chart.set_x_axis(
{
'num_font': {'italic': True,'size':11,'bold':True,}
}
)
chart.set_y_axis(
{
'major_gridlines':{'visible':False},
'visible':None
}
)
chart.set_title(
{
'name':'1-2月销售量',
'name_font': {'name': '微软雅黑'}
}
)
chart.set_size({'width':620,'height':350})
chart.set_chartarea({'border':{'none':True}})
ws.hide_gridlines(2)
chart.add_series(data1)
chart.add_series(data2)
ws.insert_chart('B8',chart)
wb.close()