Python 使用xlwings库操作excel的简明实践分享之实现表格加入图表
在Excel中绘制图表也是一个较为常见的用途。基础图形折线图、柱状图和饼图是一种既简单又非常鲜明的表现形式。这里使用前面构造的数据表格,选取部分数据进行绘制
基础框架
给一个表格增加一张图表
以一个单元格为边界位置增加一个图表
cell = ws.range((1, 1))
chart = ws.charts.add(left=cell.left, top=cell.top)
设置标题
chart.api[1].ChartTitle.Text = '图名'
设置图表数据来源
这里数据来源只能是表格的Range类型,所以跨列提取数据是不能直接实现的
chart.set_source_data(ws.range((1, 1)).expand())
设置图表类型
chart.chart_type = 'XXX’
具体的类型可以在xlwings库中main文件chart_type属性的注释查看。常用的有:
不设置,竖向柱状图;bar_clustered,横向聚集柱状图;line,折线图;pie,饼图
设置宽高
chart.heiget chart.width
绘制学生语文成绩柱状图
基本完整的代码如下,其中,选取了语文成绩列和姓名列作为数据,因为来源数据必须是表格内部的数据,我们不能直接跨列选到这些数据,所以先将这部分数据转入一张新的表中,再依据这段范围生成图表。图表类型为bar_clustered。
app = xlwings.App(visible=True, add_book=False)
app.display_alerts = False
wb = app.books.open('data.xlsx')
ws_data = wb.sheets.active
ws = wb.sheets.add()
cell = ws.range((1, 1))
chart = ws.charts.add(left=cell.left, top=cell.top)
name = ws_data.range((1, 2)).expand('down').value
score = ws_data.range((1, 10)).expand('down').value
data = [name, score]
chart_data = [[name[index], score[index]] for index, value in enumerate(score)]
ws.range((1, 1)).value = chart_data
chart.set_source_data(ws.range((1, 1)).expand())
chart.api[1].ChartTitle.Text = '语文成绩柱状图'
chart.chart_type = '[bar_clustered]()'
图形效果如下
多成绩折线图
与前面相同的步骤,提取数据,存入新工作表,绘制图形。图表类型为line。
app = xlwings.App(visible=True, add_book=False)
app.display_alerts = False
wb = app.books.open('data.xlsx')
ws_data = wb.sheets.active
ws = wb.sheets.add()
cell = ws.range((1, 1))
chart = ws.charts.add(left=cell.left, top=cell.top)
name = ws_data.range((1, 2)).expand('down').value
score = ws_data.range((1, 10)).expand().value
print(name)
print(score)
chart_data = []
for index, value in enumerate(score):
value.insert(0,name[index])
chart_data.append(value)
ws.range((1, 1)).value = chart_data
chart.set_source_data(ws.range((1, 1)).expand())
chart.chart_type = 'line'
# chart.api[1].ChartTitle.text = '成绩图'
效果如下,此处未设置标题,可能是个bug,我电脑设置不了。
选择line_markers类型的图表能看到更多的标记
选择line_stacked类型的堆叠图表能得到类似总分的东西
转载自:https://juejin.cn/post/7227610019914514492