Date:2022-03-07
实现多列多表格自动生成折线图
分析:
1、先尝试画出一个散点图
#导入模块
from openpyxl import load_workbook
from 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,包含标题
#第三步:创建series
series1 = 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轴的刻度
# 第五步:将数据系列添加到图中b
chart.append(series1)
# 第六步:将图添加到工作表中
ws1.add_chart(chart,'H7')
# 第七步:保存Excel
wb.save('E:/users/lxhui/Desktop/散点图.xlsx')
2、画第二条线
#导入模块
from openpyxl import load_workbook
from 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_row
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=2)
series2 = Series(ydata2,xdata2,title_from_data=True)
#第三步:创建series
series1 = 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轴的刻度
# 第五步:将数据系列添加到图中b
chart.append(series1)
chart.append(series2)
# 第六步:将图添加到工作表中
ws1.add_chart(chart,'H7')
# 第七步:保存Excel
wb.save('E:/users/lxhui/Desktop/散点图.xlsx')
3、开始循环有多少列
#导入模块
from openpyxl import load_workbook
from 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,4
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=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)
#第三步:创建series
series2 = Series(ydata2,xdata2,title_from_data=True)
# 第四步:创建散点图,并设置图的样式
chart=ScatterChart()
chart.title='测试标题,第{}列'.format(col-1) #这个名字,取的是列的名字,如取的col值为2,那么列名就是before1
chart.style=10
chart.y_axis.title='R(Ω)'#y轴的名称
chart.x_axis.title='Temp(℃)'#x轴的名称
chart.y_axis.scaling.logBase = 10#y轴的刻度
# 第五步:将数据系列添加到图中b
chart.append(series1)
chart.append(series2)
# 第六步:将图添加到工作表中
ws1.add_chart(chart,'{}{}'.format(lst1[(col-2)%2], (maxRow1+3+30*((col-2)//2))))
# 第七步:保存Excel
wb.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_workbook
from 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)#计算出有多个sheet
for 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#取的值为4
for col in range(2, maxCol+1):#(2,5)取出来的是2,3,4
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=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)
#第三步:创建series
series2 = Series(ydata2,xdata2,title_from_data=True)
# 第四步:创建散点图,并设置图的样式
chart=ScatterChart()
chart.title='测试标题,第{}列'.format(col-1) #这个名字,取的是列的名字,如取的col值为2,那么列名就是before1
chart.style=10
chart.y_axis.title='R(Ω)'#y轴的名称
chart.x_axis.title='Temp(℃)'#x轴的名称
chart.y_axis.scaling.logBase = 10#y轴的刻度
# 第五步:将数据系列添加到图中b
chart.append(series1)
chart.append(series2)
# 第六步:将图添加到工作表中
ws1.add_chart(chart,'{}{}'.format(lst1[(col-2)%2], (maxRow1+3+30*((col-2)//2))))
# 第七步:保存Excel
wb.save('E:/users/lxhui/Desktop/散点图.xlsx')
5、优化,完整代码如下
#导入模块
from openpyxl import load_workbook
from 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#取的值为3
for col in range(2, maxCol+1):#(2,4)取出来的是2,3
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=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=10
chart.y_axis.title='R(Ω)'#y轴的名称
chart.x_axis.title='Temp(℃)'#x轴的名称
chart.y_axis.scaling.logBase = 10#y轴的刻度
# 第五步:将数据系列添加到图中b
chart.append(series1)
chart.append(series2)
# 第六步:将图添加到工作表中
ws1.add_chart(chart,'{}{}'.format(lst2[(col-2)%2], (maxRow1+3+30*((col-2)//2))))
# 第七步:保存Excel
wb.save('E:/users/lxhui/Desktop/散点图.xlsx')
maxRow1 = max([val.row for val in ws1[‘A’] if val.value]) 加上这句话,能更加准确的定位到有多少行[【列表表达式】