Date:2022-03-07
实现多列多表格自动生成折线图

分析:

1、先尝试画出一个散点图

  1. #导入模块
  2. from openpyxl import load_workbook
  3. from openpyxl.chart import(ScatterChart, Reference, Series)
  4. # 第一步:打开Excel及工作表
  5. wb = load_workbook('E:/users/lxhui/Desktop/散点图.xlsx') # 打开已存在的本地表
  6. ws = wb.active
  7. # 第二步:选择X、Y轴数据,并创建成一个数据系列
  8. ws1 = wb.worksheets[0]#访问第一个sheet1 只有1个表的时候,可以不写这句
  9. maxRow1 = ws1.max_row #获取最大行 print(maxRow1)
  10. xdata1 = Reference(worksheet=ws1,min_row=2, max_row=maxRow1,min_col=1,max_col=1) #最小行数是2,不包含标题
  11. ydata1 = Reference(worksheet=ws1,min_row=1, max_row=maxRow1,min_col=2,max_col=2) #最小行数是1,包含标题
  12. #第三步:创建series
  13. series1 = Series(ydata1,xdata1,title_from_data=True)
  14. # 第四步:创建散点图,并设置图的样式
  15. chart=ScatterChart()
  16. chart.title='测试标题'
  17. chart.style=10 #这样设置,颜色才会不一样
  18. chart.y_axis.title='R(Ω)'#y轴的名称
  19. chart.x_axis.title='Temp(℃)'#x轴的名称
  20. chart.y_axis.scaling.logBase = 10#y轴的刻度
  21. # 第五步:将数据系列添加到图中b
  22. chart.append(series1)
  23. # 第六步:将图添加到工作表中
  24. ws1.add_chart(chart,'H7')
  25. # 第七步:保存Excel
  26. wb.save('E:/users/lxhui/Desktop/散点图.xlsx')

输出结果为:
image.png

2、画第二条线

  1. #导入模块
  2. from openpyxl import load_workbook
  3. from openpyxl.chart import(ScatterChart, Reference, Series)
  4. # 第一步:打开Excel及工作表
  5. wb = load_workbook('E:/users/lxhui/Desktop/散点图.xlsx') # 打开已存在的本地表
  6. ws = wb.active
  7. # 第二步:选择X、Y轴数据,并创建成一个数据系列
  8. ws1 = wb.worksheets[0]#访问第一个sheet1 只有1个表的时候,可以不写这句
  9. maxRow1 = ws1.max_row #获取最大行 print(maxRow1)
  10. xdata1 = Reference(worksheet=ws1,min_row=2, max_row=maxRow1,min_col=1,max_col=1) #最小行数是2,不包含标题
  11. ydata1 = Reference(worksheet=ws1,min_row=1, max_row=maxRow1,min_col=2,max_col=2) #最小行数是1,包含标题
  12. #第二条线
  13. ws2 = wb.worksheets[1]#访问第一个sheet1 只有1个表的时候,可以不写这句
  14. maxRow2 = ws2.max_row
  15. xdata2 = Reference(worksheet=ws2,min_row=2, max_row=maxRow2,min_col=1,max_col=1)
  16. ydata2 = Reference(worksheet=ws2,min_row=1, max_row=maxRow2,min_col=2,max_col=2)
  17. series2 = Series(ydata2,xdata2,title_from_data=True)
  18. #第三步:创建series
  19. series1 = Series(ydata1,xdata1,title_from_data=True)
  20. # 第四步:创建散点图,并设置图的样式
  21. chart=ScatterChart()
  22. chart.title='测试标题'
  23. chart.style=10 #这样设置,颜色才会不一样
  24. chart.y_axis.title='R(Ω)'#y轴的名称
  25. chart.x_axis.title='Temp(℃)'#x轴的名称
  26. chart.y_axis.scaling.logBase = 10#y轴的刻度
  27. # 第五步:将数据系列添加到图中b
  28. chart.append(series1)
  29. chart.append(series2)
  30. # 第六步:将图添加到工作表中
  31. ws1.add_chart(chart,'H7')
  32. # 第七步:保存Excel
  33. wb.save('E:/users/lxhui/Desktop/散点图.xlsx')

image.png
只增加①②,其他没变

3、开始循环有多少列

  1. #导入模块
  2. from openpyxl import load_workbook
  3. from openpyxl.chart import(ScatterChart, Reference, Series)
  4. #这个lst1,用来定位图表所放的位置
  5. lst1 = ['H','Q']
  6. # 第一步:打开Excel及工作表
  7. wb = load_workbook('E:/users/lxhui/Desktop/散点图.xlsx') # 打开已存在的本地表
  8. # 第二步:选择X、Y轴数据,并创建成一个数据系列
  9. ws1 = wb.worksheets[0]
  10. ws2 = wb.worksheets[1]
  11. maxRow1 = ws1.max_row #获取最大行 print(maxRow1)
  12. maxRow2 = ws2.max_row#获取最大行 print(maxRow2)
  13. maxCol = ws1.max_column#计算,最大列有多少,取的值为4
  14. #这里用for循环来统计列:
  15. for col in range(2, maxCol+1):#(2,5)取出来的是2,3,4
  16. xdata1 = Reference(worksheet=ws1,min_row=2, max_row=maxRow1,min_col=1,max_col=1) #最小行数是2,不包含标题
  17. ydata1 = Reference(worksheet=ws1,min_row=1, max_row=maxRow1,min_col=2,max_col=col) #最小行数是1,包含标题,max_col=col这里要循环列
  18. series1 = Series(ydata1,xdata1,title_from_data=True)
  19. #第二条线
  20. xdata2 = Reference(worksheet=ws2,min_row=2, max_row=maxRow2,min_col=1,max_col=1)
  21. ydata2 = Reference(worksheet=ws2,min_row=1, max_row=maxRow2,min_col=2,max_col=col)
  22. #第三步:创建series
  23. series2 = Series(ydata2,xdata2,title_from_data=True)
  24. # 第四步:创建散点图,并设置图的样式
  25. chart=ScatterChart()
  26. chart.title='测试标题,第{}列'.format(col-1) #这个名字,取的是列的名字,如取的col值为2,那么列名就是before1
  27. chart.style=10
  28. chart.y_axis.title='R(Ω)'#y轴的名称
  29. chart.x_axis.title='Temp(℃)'#x轴的名称
  30. chart.y_axis.scaling.logBase = 10#y轴的刻度
  31. # 第五步:将数据系列添加到图中b
  32. chart.append(series1)
  33. chart.append(series2)
  34. # 第六步:将图添加到工作表中
  35. ws1.add_chart(chart,'{}{}'.format(lst1[(col-2)%2], (maxRow1+3+30*((col-2)//2))))
  36. # 第七步:保存Excel
  37. wb.save('E:/users/lxhui/Desktop/散点图.xlsx')

image.png

①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 image.png ④确定图表的位置 format(lst1[(col-2)%2], (maxRow1+3+30*((col-2)//2) image.png image.png 这样可以确保是2个图表,然后换行

4、开始循环有多个sheet表格

  1. #导入模块
  2. from openpyxl import load_workbook
  3. from openpyxl.chart import(ScatterChart, Reference, Series)
  4. lst1 = ['H','Q']
  5. # 第一步:打开Excel及工作表
  6. wb = load_workbook('E:/users/lxhui/Desktop/散点图.xlsx') # 打开已存在的本地表
  7. ws = wb.active
  8. # 第二步:选择X、Y轴数据,并创建成一个数据系列
  9. allPageNum = len(wb.worksheets)#计算出有多个sheet
  10. for pageNum in range(0, allPageNum, 2):
  11. ws1 = wb.worksheets[pageNum]
  12. ws2 = wb.worksheets[pageNum + 1]
  13. maxRow1 = ws1.max_row #获取最大行 print(maxRow1)
  14. maxRow2 = ws2.max_row#获取最大行 print(maxRow2)
  15. maxCol = ws1.max_column#取的值为4
  16. for col in range(2, maxCol+1):#(2,5)取出来的是2,3,4
  17. xdata1 = Reference(worksheet=ws1,min_row=2, max_row=maxRow1,min_col=1,max_col=1) #最小行数是2,不包含标题
  18. ydata1 = Reference(worksheet=ws1,min_row=1, max_row=maxRow1,min_col=2,max_col=col) #最小行数是1,包含标题
  19. series1 = Series(ydata1,xdata1,title_from_data=True)
  20. xdata2 = Reference(worksheet=ws2,min_row=2, max_row=maxRow2,min_col=1,max_col=1)
  21. ydata2 = Reference(worksheet=ws2,min_row=1, max_row=maxRow2,min_col=2,max_col=col)
  22. #第三步:创建series
  23. series2 = Series(ydata2,xdata2,title_from_data=True)
  24. # 第四步:创建散点图,并设置图的样式
  25. chart=ScatterChart()
  26. chart.title='测试标题,第{}列'.format(col-1) #这个名字,取的是列的名字,如取的col值为2,那么列名就是before1
  27. chart.style=10
  28. chart.y_axis.title='R(Ω)'#y轴的名称
  29. chart.x_axis.title='Temp(℃)'#x轴的名称
  30. chart.y_axis.scaling.logBase = 10#y轴的刻度
  31. # 第五步:将数据系列添加到图中b
  32. chart.append(series1)
  33. chart.append(series2)
  34. # 第六步:将图添加到工作表中
  35. ws1.add_chart(chart,'{}{}'.format(lst1[(col-2)%2], (maxRow1+3+30*((col-2)//2))))
  36. # 第七步:保存Excel
  37. wb.save('E:/users/lxhui/Desktop/散点图.xlsx')

image.png
image.png

5、优化,完整代码如下

  1. #导入模块
  2. from openpyxl import load_workbook
  3. from openpyxl.chart import(ScatterChart, Reference, Series)
  4. lst1 = ['H','Q','U']
  5. # 1:打开Excel及工作表
  6. wb = load_workbook('E:/users/lxhui/Desktop/散点图.xlsx') # 打开已存在的本地表
  7. ws = wb.active
  8. # 2:选择X、Y轴数据,并创建成一个数据系列
  9. allPageNum = len(wb.worksheets)
  10. for pageNum in range(0, allPageNum, 2):
  11. ws1 = wb.worksheets[pageNum]
  12. ws2 = wb.worksheets[pageNum + 1]
  13. # maxRow1 = ws1.max_row #获取最大行 print(maxRow1)
  14. maxRow1 = max([val.row for val in ws1['A'] if val.value])#这个加了列表表达式,逻辑更加谨慎
  15. # maxRow2 = ws2.max_row#获取最大行 print(maxRow2)
  16. maxRow2 = max([val.row for val in ws2['A'] if val.value])#这个加了列表表达式,逻辑更加谨慎
  17. maxCol = ws1.max_column#取的值为3
  18. for col in range(2, maxCol+1):#(2,4)取出来的是2,3
  19. xdata1 = Reference(worksheet=ws1,min_row=2, max_row=maxRow1,min_col=1,max_col=1) #最小行数是2,不包含标题
  20. ydata1 = Reference(worksheet=ws1,min_row=1, max_row=maxRow1,min_col=2,max_col=col) #最小行数是1,包含标题
  21. series1 = Series(ydata1,xdata1,title_from_data=True)
  22. xdata2 = Reference(worksheet=ws2,min_row=2, max_row=maxRow2,min_col=1,max_col=1)
  23. ydata2 = Reference(worksheet=ws2,min_row=1, max_row=maxRow2,min_col=2,max_col=col)
  24. series2 = Series(ydata2,xdata2,title_from_data=True)
  25. # 第四步:创建散点图,并设置图的样式
  26. chart=ScatterChart()
  27. chart.title='测试标题,第{}列'.format(col-1)
  28. chart.style=10
  29. chart.y_axis.title='R(Ω)'#y轴的名称
  30. chart.x_axis.title='Temp(℃)'#x轴的名称
  31. chart.y_axis.scaling.logBase = 10#y轴的刻度
  32. # 第五步:将数据系列添加到图中b
  33. chart.append(series1)
  34. chart.append(series2)
  35. # 第六步:将图添加到工作表中
  36. ws1.add_chart(chart,'{}{}'.format(lst2[(col-2)%2], (maxRow1+3+30*((col-2)//2))))
  37. # 第七步:保存Excel
  38. wb.save('E:/users/lxhui/Desktop/散点图.xlsx')

maxRow1 = max([val.row for val in ws1[‘A’] if val.value]) 加上这句话,能更加准确的定位到有多少行[【列表表达式】 image.pngimage.png

6、完成

可参考链接:https://blog.csdn.net/y_996/article/details/120933374