相关文章推荐
腼腆的匕首  ·  System.Reflection.Targ ...·  2 月前    · 
宽容的山楂  ·  SCENIC ...·  1 年前    · 
失落的饭卡  ·  javascript - Uncaught ...·  1 年前    · 
乖乖的夕阳  ·  SpringCloud Eureka ...·  1 年前    · 

设置图表数据来源

这里数据来源只能是表格的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类型的堆叠图表能得到类似总分的东西

我真是泰库辣
粉丝