Date:2022-03-07
实现多列多表格自动生成折线图
分析:
1、先尝试画出一个散点图
#导入模块from openpyxl import load_workbookfrom openpyxl.chart import(ScatterChart, Reference, Series)# 第一步:打开Excel及工作表wb = load_workbook('E:/users/lxhui/Desktop/散点图.xlsx') # 打开已存在的本地表ws = wb.active# 第二步:选择X、Y轴数据,并创建成一个数据系列ws1 = wb.worksheets[0]#访问第一个sheet1 只有1个表的时候,可以不写这句maxRow1 = ws1.max_row #获取最大行 print(maxRow1)xdata1 = Reference(worksheet=ws1,min_row=2, max_row=maxRow1,min_col=1,max_col=1) #最小行数是2,不包含标题ydata1 = Reference(worksheet=ws1,min_row=1, max_row=maxRow1,min_col=2,max_col=2) #最小行数是1,包含标题#第三步:创建seriesseries1 = Series(ydata1,xdata1,title_from_data=True)# 第四步:创建散点图,并设置图的样式chart=ScatterChart()chart.title='测试标题'chart.style=10 #这样设置,颜色才会不一样chart.y_axis.title='R(Ω)'#y轴的名称chart.x_axis.title='Temp(℃)'#x轴的名称chart.y_axis.scaling.logBase = 10#y轴的刻度# 第五步:将数据系列添加到图中bchart.append(series1)# 第六步:将图添加到工作表中ws1.add_chart(chart,'H7')# 第七步:保存Excelwb.save('E:/users/lxhui/Desktop/散点图.xlsx')
2、画第二条线
#导入模块from openpyxl import load_workbookfrom openpyxl.chart import(ScatterChart, Reference, Series)# 第一步:打开Excel及工作表wb = load_workbook('E:/users/lxhui/Desktop/散点图.xlsx') # 打开已存在的本地表ws = wb.active# 第二步:选择X、Y轴数据,并创建成一个数据系列ws1 = wb.worksheets[0]#访问第一个sheet1 只有1个表的时候,可以不写这句maxRow1 = ws1.max_row #获取最大行 print(maxRow1)xdata1 = Reference(worksheet=ws1,min_row=2, max_row=maxRow1,min_col=1,max_col=1) #最小行数是2,不包含标题ydata1 = Reference(worksheet=ws1,min_row=1, max_row=maxRow1,min_col=2,max_col=2) #最小行数是1,包含标题#第二条线ws2 = wb.worksheets[1]#访问第一个sheet1 只有1个表的时候,可以不写这句maxRow2 = ws2.max_rowxdata2 = Reference(worksheet=ws2,min_row=2, max_row=maxRow2,min_col=1,max_col=1)ydata2 = Reference(worksheet=ws2,min_row=1, max_row=maxRow2,min_col=2,max_col=2)series2 = Series(ydata2,xdata2,title_from_data=True)#第三步:创建seriesseries1 = Series(ydata1,xdata1,title_from_data=True)# 第四步:创建散点图,并设置图的样式chart=ScatterChart()chart.title='测试标题'chart.style=10 #这样设置,颜色才会不一样chart.y_axis.title='R(Ω)'#y轴的名称chart.x_axis.title='Temp(℃)'#x轴的名称chart.y_axis.scaling.logBase = 10#y轴的刻度# 第五步:将数据系列添加到图中bchart.append(series1)chart.append(series2)# 第六步:将图添加到工作表中ws1.add_chart(chart,'H7')# 第七步:保存Excelwb.save('E:/users/lxhui/Desktop/散点图.xlsx')
3、开始循环有多少列
#导入模块from openpyxl import load_workbookfrom openpyxl.chart import(ScatterChart, Reference, Series)#这个lst1,用来定位图表所放的位置lst1 = ['H','Q']# 第一步:打开Excel及工作表wb = load_workbook('E:/users/lxhui/Desktop/散点图.xlsx') # 打开已存在的本地表# 第二步:选择X、Y轴数据,并创建成一个数据系列ws1 = wb.worksheets[0]ws2 = wb.worksheets[1]maxRow1 = ws1.max_row #获取最大行 print(maxRow1)maxRow2 = ws2.max_row#获取最大行 print(maxRow2)maxCol = ws1.max_column#计算,最大列有多少,取的值为4#这里用for循环来统计列:for col in range(2, maxCol+1):#(2,5)取出来的是2,3,4xdata1 = Reference(worksheet=ws1,min_row=2, max_row=maxRow1,min_col=1,max_col=1) #最小行数是2,不包含标题ydata1 = Reference(worksheet=ws1,min_row=1, max_row=maxRow1,min_col=2,max_col=col) #最小行数是1,包含标题,max_col=col这里要循环列series1 = Series(ydata1,xdata1,title_from_data=True)#第二条线xdata2 = Reference(worksheet=ws2,min_row=2, max_row=maxRow2,min_col=1,max_col=1)ydata2 = Reference(worksheet=ws2,min_row=1, max_row=maxRow2,min_col=2,max_col=col)#第三步:创建seriesseries2 = Series(ydata2,xdata2,title_from_data=True)# 第四步:创建散点图,并设置图的样式chart=ScatterChart()chart.title='测试标题,第{}列'.format(col-1) #这个名字,取的是列的名字,如取的col值为2,那么列名就是before1chart.style=10chart.y_axis.title='R(Ω)'#y轴的名称chart.x_axis.title='Temp(℃)'#x轴的名称chart.y_axis.scaling.logBase = 10#y轴的刻度# 第五步:将数据系列添加到图中bchart.append(series1)chart.append(series2)# 第六步:将图添加到工作表中ws1.add_chart(chart,'{}{}'.format(lst1[(col-2)%2], (maxRow1+3+30*((col-2)//2))))# 第七步:保存Excelwb.save('E:/users/lxhui/Desktop/散点图.xlsx')

①for col in range(2, maxCol+1): 列是从第二列开始取数的,所以要确定一个范围,maxCol=4,maxCol+1=5, (2,5)取出来的结果是2,3,4 ②因为列是循环的,所以这里是:max_col=col ③chart.title=’测试标题,第{}列’.format(col-1) 这个名字,取的是列的名字,如取的col值为2,那么列名就是before1
④确定图表的位置 format(lst1[(col-2)%2], (maxRow1+3+30*((col-2)//2)
![]()
这样可以确保是2个图表,然后换行
4、开始循环有多个sheet表格
#导入模块from openpyxl import load_workbookfrom openpyxl.chart import(ScatterChart, Reference, Series)lst1 = ['H','Q']# 第一步:打开Excel及工作表wb = load_workbook('E:/users/lxhui/Desktop/散点图.xlsx') # 打开已存在的本地表ws = wb.active# 第二步:选择X、Y轴数据,并创建成一个数据系列allPageNum = len(wb.worksheets)#计算出有多个sheetfor pageNum in range(0, allPageNum, 2):ws1 = wb.worksheets[pageNum]ws2 = wb.worksheets[pageNum + 1]maxRow1 = ws1.max_row #获取最大行 print(maxRow1)maxRow2 = ws2.max_row#获取最大行 print(maxRow2)maxCol = ws1.max_column#取的值为4for col in range(2, maxCol+1):#(2,5)取出来的是2,3,4xdata1 = Reference(worksheet=ws1,min_row=2, max_row=maxRow1,min_col=1,max_col=1) #最小行数是2,不包含标题ydata1 = Reference(worksheet=ws1,min_row=1, max_row=maxRow1,min_col=2,max_col=col) #最小行数是1,包含标题series1 = Series(ydata1,xdata1,title_from_data=True)xdata2 = Reference(worksheet=ws2,min_row=2, max_row=maxRow2,min_col=1,max_col=1)ydata2 = Reference(worksheet=ws2,min_row=1, max_row=maxRow2,min_col=2,max_col=col)#第三步:创建seriesseries2 = Series(ydata2,xdata2,title_from_data=True)# 第四步:创建散点图,并设置图的样式chart=ScatterChart()chart.title='测试标题,第{}列'.format(col-1) #这个名字,取的是列的名字,如取的col值为2,那么列名就是before1chart.style=10chart.y_axis.title='R(Ω)'#y轴的名称chart.x_axis.title='Temp(℃)'#x轴的名称chart.y_axis.scaling.logBase = 10#y轴的刻度# 第五步:将数据系列添加到图中bchart.append(series1)chart.append(series2)# 第六步:将图添加到工作表中ws1.add_chart(chart,'{}{}'.format(lst1[(col-2)%2], (maxRow1+3+30*((col-2)//2))))# 第七步:保存Excelwb.save('E:/users/lxhui/Desktop/散点图.xlsx')
5、优化,完整代码如下
#导入模块from openpyxl import load_workbookfrom openpyxl.chart import(ScatterChart, Reference, Series)lst1 = ['H','Q','U']# 1:打开Excel及工作表wb = load_workbook('E:/users/lxhui/Desktop/散点图.xlsx') # 打开已存在的本地表ws = wb.active# 2:选择X、Y轴数据,并创建成一个数据系列allPageNum = len(wb.worksheets)for pageNum in range(0, allPageNum, 2):ws1 = wb.worksheets[pageNum]ws2 = wb.worksheets[pageNum + 1]# maxRow1 = ws1.max_row #获取最大行 print(maxRow1)maxRow1 = max([val.row for val in ws1['A'] if val.value])#这个加了列表表达式,逻辑更加谨慎# maxRow2 = ws2.max_row#获取最大行 print(maxRow2)maxRow2 = max([val.row for val in ws2['A'] if val.value])#这个加了列表表达式,逻辑更加谨慎maxCol = ws1.max_column#取的值为3for col in range(2, maxCol+1):#(2,4)取出来的是2,3xdata1 = Reference(worksheet=ws1,min_row=2, max_row=maxRow1,min_col=1,max_col=1) #最小行数是2,不包含标题ydata1 = Reference(worksheet=ws1,min_row=1, max_row=maxRow1,min_col=2,max_col=col) #最小行数是1,包含标题series1 = Series(ydata1,xdata1,title_from_data=True)xdata2 = Reference(worksheet=ws2,min_row=2, max_row=maxRow2,min_col=1,max_col=1)ydata2 = Reference(worksheet=ws2,min_row=1, max_row=maxRow2,min_col=2,max_col=col)series2 = Series(ydata2,xdata2,title_from_data=True)# 第四步:创建散点图,并设置图的样式chart=ScatterChart()chart.title='测试标题,第{}列'.format(col-1)chart.style=10chart.y_axis.title='R(Ω)'#y轴的名称chart.x_axis.title='Temp(℃)'#x轴的名称chart.y_axis.scaling.logBase = 10#y轴的刻度# 第五步:将数据系列添加到图中bchart.append(series1)chart.append(series2)# 第六步:将图添加到工作表中ws1.add_chart(chart,'{}{}'.format(lst2[(col-2)%2], (maxRow1+3+30*((col-2)//2))))# 第七步:保存Excelwb.save('E:/users/lxhui/Desktop/散点图.xlsx')
maxRow1 = max([val.row for val in ws1[‘A’] if val.value]) 加上这句话,能更加准确的定位到有多少行[【列表表达式】

④确定图表的位置
format(lst1[(col-2)%2], (maxRow1+3+30*((col-2)//2)
这样可以确保是2个图表,然后换行


