使用XlsxWriter库生成Excel图表

最近一个项目需要导出一个带图表的报表文件,该文件格式为Excel格式,当时想到了两种方式。方式一:前端把EChart图的BASE64编码传给后台,后台解析成图片后插入Excel;方式二:后台把数据先插入Excel,使用Excel的图表功能生成图表。经过讨论,最后我们选择了方案二。

双柱状图

1、创建Excel对象,新建Sheet

1
2
workbook = xlsxwriter.Workbook('Chart.xlsx')
sheet = workbook.add_worksheet('TEST')

2、准备数据

1
2
3
4
5
6
7
8
# 表头
titles = ['', '篮球', '排球', '足球', '受访总人数']
# 数据
export_data = [
['男', 11, 21, 31, 63],
['女', 12, 22, 32, 66],
['受访总人数', 23, 43, 63, 129]
]

3、表头格式

1
2
3
4
5
6
7
8
9
10
11
12
13
column_title_format = workbook.add_format({
'bold': 1,
'border': 1,
'align': 'center',
'valign': 'vcenter',
'font_size': 12
})
data_format = workbook.add_format({
'border': 1,
'align': 'center',
'valign': 'vcenter',
'font_size': 12
})

4、写入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
# 写入数据:标题
column_index = 0
titles = [{'name': item, 'width': 20} for item in titles]
for t in titles:
sheet.write(0, column_index, t['name'], column_title_format)
sheet.set_column(column_index, column_index, t['width'])
column_index += 1
# 写入数据:数据
start_row = 1 # 起始行
for item in export_data:
for i, value in enumerate(item):
sheet.write(start_row, i, value, column_title_format if i == 0 else data_format)
start_row += 1

5、添加图表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
chart = workbook.add_chart({'type': 'column'})

data_len = len(export_data)

for i in range(data_len):
if i == 0: # 第一行是表头
continue
chart.add_series({
'name': ['TEST', i, 0, i, 0], # Legend
'categories': ['TEST', 0, 1, 0, len(titles) - 2], # 分类
'values': ['TEST', i, 1, i, len(titles) - 2],
'data_labels': {'value': True} # 是否在图表上显示数值
})

# 设置图表标题
chart.set_title({'name': 'Q1 X Q2', 'name_font': {'size': 12}})
# 设置Legend位置
chart.set_legend({'position': 'bottom'})
chart.set_style(10)
# 图表大小(像素)
chart.height = 250
chart.width = 400

# 在第几行插入图表
start_row = 1 + len(export_data) + 1 + 1 # 索引补1行、表头1行、数据N行、空1行
sheet.insert_chart('A%s' % start_row, chart)

6、生成文件

1
workbook.close()

chart

  • 本文作者: Harmel
  • 本文链接: http://www.harmel.cn/2018/10/xlsxwriter-chart.html
  • 版权声明: 文章如无特别说明,则表明该文章为原创文章,如需要转载,请注明出处。
  • 本站说明: 本站使用阿里云服务器,如果您喜欢我的网站,欢迎收藏,能捐赠支持一下就再好不过了。