最近在统计资产,正好看到了xlsxwriter这个表格生成模块,借此机会,熟悉一下,写点有趣的小案例,一开始想使用C++ QT图形化开发一套自动化运维平台,但后来发现不仅消耗时间而且需要解决QT Qssh远程模块的一些问题,后来没有使用QT做,xlsxwriter模块来做非常的简单,所以使用它。

上班不能摸鱼,我要努力摸鱼,不不不,学习,不然今天我摸鱼,明天鱼摸我。。

绘制磁盘统计(封装表格)

封装前需要先来找出规律: 先找到表格生成坐标与大小之间的比值关系,这是第一步。

  1. import xlsxwriter
  2. workbook = xlsxwriter.Workbook('chart_line.xlsx')
  3. worksheet3 = workbook.add_worksheet("系统磁盘统计")
  4. merge_format = workbook.add_format({
  5. 'bold': True,
  6. 'border': 1,
  7. 'align': 'center',
  8. 'valign': 'vcenter',
  9. 'fg_color': '#EEAEEE',
  10. })
  11. worksheet3.merge_range('A9:B12', '192.168.1.1', merge_format)
  12. # -------------------------------------------------------------------------
  13. head = ["IP地址","IP地址","路径","总容量","剩余容量","利用率"]
  14. merge_format1 = workbook.add_format({
  15. 'bold': True,
  16. 'border': 1,
  17. 'align': 'center',#水平居中
  18. 'valign': 'vcenter',#垂直居中
  19. 'fg_color': '#AEEEEE',#颜色填充
  20. })
  21. worksheet3.write_row("A8:B12",head,merge_format1) #显示表头
  22. worksheet3.merge_range('A8:B8',"IP地址",merge_format1) # 合并表头(合并第一个元素)
  23. data1 = ["/etc/system/winsss/aaa","/proc/","/sys","/abc/lyshark"]
  24. merge_format2 = workbook.add_format\
  25. ({'bold': True,'border': 1,'valign': 'vcenter','fg_color': '#D7E4BC','align': 'center'})
  26. worksheet3.write_column("C9",data1,merge_format2)
  27. worksheet3.set_column("C9:C9",30)
  28. data2 = ["1024GG","2048GB","111GB","1111GB"]
  29. merge_format3 = workbook.add_format\
  30. ({'bold': True,'border': 1,'valign': 'vcenter','fg_color': '#D7E4BC','align': 'center'})
  31. worksheet3.write_column("D9",data2,merge_format3)
  32. worksheet3.set_column("D9:D9",20)
  33. data3 = ["1024GG","2048GB","111GB","22GB"]
  34. merge_format4 = workbook.add_format\
  35. ({'bold': True,'border': 1,'valign': 'vcenter','fg_color': '#D7E4BC','align': 'center'})
  36. worksheet3.write_column("E9",data3,merge_format4)
  37. worksheet3.set_column("E9:E9",20)
  38. data4= ["10%","50%","20%","33%"]
  39. merge_format5 = workbook.add_format\
  40. ({'bold': True,'border': 1,'valign': 'vcenter','fg_color': '#D7E4BC','align': 'center'})
  41. worksheet3.write_column("F9",data4,merge_format5)
  42. worksheet3.set_column("F9:F9",20)
  43. '''
  44. val =
  45. [
  46. ["IP地址","IP地址","路径","总容量","剩余容量","利用率"],
  47. ["/etc/","/proc","/user","/test","lyshark"],
  48. ["1GB","2GB","3GB","4GB","5GB"],
  49. ["1GB","2GB","3GB","4GB","5GB"],
  50. ["10%","10%","10%","10%","10%"]
  51. ]
  52. SetDiskTable(address,val)
  53. '''
  54. workbook.close()

接着对其进行封装:找到规律后就要对其进行封装,封装成一个可直接调用的方法。

  1. import xlsxwriter
  2. workbook = xlsxwriter.Workbook('chart_line.xlsx')
  3. worksheet = workbook.add_worksheet("系统磁盘统计")
  4. def CreateDiskTable(address,data,section):
  5. merge_format = workbook.add_format(
  6. {'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': '#EEAEEE'})
  7. header_count = len(data[1])
  8. merge_format1 = workbook.add_format(
  9. {'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': '#AEEEEE'})
  10. # 根据磁盘路径计算出表格大小
  11. header_range = "A{}:B{}".format(section,section+header_count)
  12. worksheet.write_row(header_range, data[0], merge_format1) # 显示表头
  13. # 计算合并表头偏移
  14. header_merge_range = "A{}:B{}".format(section,section)
  15. worksheet.merge_range(header_merge_range, "IP地址", merge_format1) # 合并表头(合并第一个元素)
  16. # 计算出地址所占总单元格大小
  17. address_merge_range = "A{}:B{}".format(section+1,section+header_count)
  18. worksheet.merge_range(address_merge_range, address , merge_format) #需要计算出来,根据传入分区数量
  19. # 通过计算得到磁盘路径所对应到表中的位置
  20. merge_format2 = workbook.add_format(
  21. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  22. index_range = "C{}".format(section+1)
  23. worksheet.write_column(index_range, data[1], merge_format2)
  24. index_range = "C{}:C{}".format(section+1,section+1)
  25. worksheet.set_column(index_range, 30)
  26. # 计算出总容量对应到表中的位置
  27. merge_format3 = workbook.add_format(
  28. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  29. index_range = "D{}".format(section + 1)
  30. worksheet.write_column(index_range, data[2], merge_format3)
  31. index_range = "D{}:D{}".format(section + 1, section + 1)
  32. worksheet.set_column(index_range, 20)
  33. # 计算出剩余容量对应到表中的位置
  34. merge_format4 = workbook.add_format(
  35. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  36. index_range = "E{}".format(section + 1)
  37. worksheet.write_column(index_range, data[3], merge_format4)
  38. index_range = "E{}:E{}".format(section + 1, section + 1)
  39. worksheet.set_column(index_range, 20)
  40. # 计算出利用率对应到表中的位置
  41. merge_format5 = workbook.add_format(
  42. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  43. index_range = "F{}".format(section + 1)
  44. worksheet.write_column(index_range, data[4], merge_format5)
  45. index_range = "F{}:F{}".format(section + 1, section + 1)
  46. worksheet.set_column(index_range, 20)
  47. # 返回计算后的表格的下两个单元的实际偏移位置
  48. return section + header_count + 3
  49. if __name__ == "__main__":
  50. val = \
  51. [
  52. ["IP地址", "IP地址", "磁盘路径", "总容量", "剩余容量", "利用率"],
  53. ["/etc/system/winsss/aaa", "/proc/", "/sys", "/abc/lyshark"],
  54. ["1024GG", "2048GB", "111GB", "1111GB"],
  55. ["1024GG", "2048GB", "111GB", "22GB"],
  56. ["10%", "50%", "20%", "33%"]
  57. ]
  58. ref = CreateDiskTable("192.168.1.1",val,8)
  59. print(ref)
  60. ref = CreateDiskTable("192.168.1.1", val, ref)
  61. CreateDiskTable("192.168.1.1", val, ref)
  62. workbook.close()

继续更新一下

  1. import xlsxwriter
  2. import json,os,sys,math
  3. import argparse
  4. import paramiko
  5. workbook = xlsxwriter.Workbook('disk.xlsx')
  6. worksheet = workbook.add_worksheet("系统磁盘统计")
  7. ssh = paramiko.SSHClient()
  8. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  9. def BatchCMD(address,username,password,port,command):
  10. try:
  11. ssh.connect(hostname=address,username=username,password=password,port=port,timeout=2)
  12. stdin , stdout , stderr = ssh.exec_command(command)
  13. result = stdout.read()
  14. if len(result) != 0:
  15. result = str(result).replace("\\n", "\n")
  16. result = result.replace("b'", "").replace("'", "")
  17. return result
  18. else:
  19. return None
  20. except Exception:
  21. return None
  22. def GetAllDiskSpace(address,username,password,port):
  23. ref = []
  24. cmd_dict = {"Linux\n" : "df | grep -v 'Filesystem' | awk '{print $6 \":\" $3 \":\" $4 \":\" $5}'",
  25. "AIX\n" : "df | grep -v 'Filesystem' | awk '{print $4 \":\" $7}'"
  26. }
  27. os_version = BatchCMD(address,username,password,port,"uname")
  28. for version,run_cmd in cmd_dict.items():
  29. if(version == os_version):
  30. os_ref = BatchCMD(address,username,password,port,run_cmd)
  31. ref_list= os_ref.split("\n")
  32. for each in ref_list:
  33. if each != "":
  34. ref_list = []
  35. ref_list = str(each.split(":"))
  36. ref.append(eval(ref_list))
  37. return ref
  38. def CreateDiskTable(address,data,section):
  39. merge_format = workbook.add_format(
  40. {'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': '#EEAEEE'})
  41. header_count = len(data[1])
  42. merge_format1 = workbook.add_format(
  43. {'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': '#AEEEEE'})
  44. # 根据磁盘路径计算出表格大小
  45. header_range = "A{}:B{}".format(section,section+header_count)
  46. worksheet.write_row(header_range, data[0], merge_format1) # 显示表头
  47. # 计算合并表头偏移
  48. header_merge_range = "A{}:B{}".format(section,section)
  49. worksheet.merge_range(header_merge_range, "IP地址", merge_format1) # 合并表头(合并第一个元素)
  50. # 计算出地址所占总单元格大小
  51. address_merge_range = "A{}:B{}".format(section+1,section+header_count)
  52. worksheet.merge_range(address_merge_range, address , merge_format) #需要计算出来,根据传入分区数量
  53. # 通过计算得到磁盘路径所对应到表中的位置
  54. merge_format2 = workbook.add_format(
  55. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  56. index_range = "C{}".format(section+1)
  57. worksheet.write_column(index_range, data[1], merge_format2)
  58. index_range = "C{}:C{}".format(section+1,section+1)
  59. worksheet.set_column(index_range, 30)
  60. # 计算出总容量对应到表中的位置
  61. merge_format3 = workbook.add_format(
  62. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  63. index_range = "D{}".format(section + 1)
  64. worksheet.write_column(index_range, data[2], merge_format3)
  65. index_range = "D{}:D{}".format(section + 1, section + 1)
  66. worksheet.set_column(index_range, 20)
  67. # 计算出剩余容量对应到表中的位置
  68. merge_format4 = workbook.add_format(
  69. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  70. index_range = "E{}".format(section + 1)
  71. worksheet.write_column(index_range, data[3], merge_format4)
  72. index_range = "E{}:E{}".format(section + 1, section + 1)
  73. worksheet.set_column(index_range, 20)
  74. # 计算出利用率对应到表中的位置
  75. merge_format5 = workbook.add_format(
  76. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  77. index_range = "F{}".format(section + 1)
  78. worksheet.write_column(index_range, data[4], merge_format5)
  79. index_range = "F{}:F{}".format(section + 1, section + 1)
  80. worksheet.set_column(index_range, 20)
  81. # 返回计算后的表格的下两个单元的实际偏移位置
  82. return section + header_count + 3
  83. if __name__ == "__main__":
  84. '''
  85. val = \
  86. [
  87. ["IP地址", "IP地址", "磁盘路径", "总容量", "剩余容量", "利用率"],
  88. ["/etc/system/winsss/aaa", "/proc/", "/sys", "/abc/lyshark"],
  89. ["1024GG", "2048GB", "111GB", "1111GB"],
  90. ["1024GG", "2048GB", "111GB", "22GB"],
  91. ["10%", "50%", "20%", "33%"]
  92. ]
  93. ref = CreateDiskTable("192.168.1.1",val,3)
  94. ref = CreateDiskTable("192.168.1.2", val, ref)
  95. CreateDiskTable("192.168.1.3", val, ref)
  96. '''
  97. ref = GetAllDiskSpace("192.168.191.4","root","1233",22)
  98. # 恒矩阵转树矩阵
  99. ref_xor = list ( map(list,zip(*ref)) )
  100. header = ["IP地址", "IP地址", "磁盘路径", "已使用", "剩余容量", "利用率"]
  101. ref_xor.insert(0,header)
  102. print(ref_xor)
  103. CreateDiskTable("192.168.191.4", ref_xor, 2)
  104. workbook.close()

增加SSH功能遵循调用规范:

  1. import xlsxwriter
  2. import paramiko
  3. import os,sys,datetime
  4. disk_name = "disk_" + str(datetime.datetime.now()).split(" ")[0] + ".xlsx"
  5. workbook = xlsxwriter.Workbook(disk_name)
  6. worksheet = workbook.add_worksheet("系统磁盘统计")
  7. ssh = paramiko.SSHClient()
  8. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  9. # 封装远程命令执行
  10. def BatchCMD(address,username,password,port,command):
  11. try:
  12. ssh.connect(hostname=address,username=username,password=password,port=port,timeout=2)
  13. stdin , stdout , stderr = ssh.exec_command(command)
  14. result = stdout.read()
  15. if len(result) != 0:
  16. result = str(result).replace("\\n", "\n")
  17. result = result.replace("b'", "").replace("'", "")
  18. return result
  19. else:
  20. return None
  21. except Exception:
  22. return None
  23. # 获取磁盘数据
  24. def GetAllDiskSpace(address,username,password,port):
  25. ref = []
  26. cmd_dict = {"Linux\n" : "df | grep -v 'Filesystem' | awk '{print $6 \":\" $3 \":\" $4 \":\" $5}'",
  27. "AIX\n" : "df | grep -v 'Filesystem' | awk '{print $7 \":\" $5 \":\" $3 \":\" $4}'"
  28. }
  29. os_version = BatchCMD(address,username,password,port,"uname")
  30. for version,run_cmd in cmd_dict.items():
  31. if(version == os_version):
  32. os_ref = BatchCMD(address,username,password,port,run_cmd)
  33. ref_list= os_ref.split("\n")
  34. for each in ref_list:
  35. if each != "":
  36. ref_list = str(each.split(":"))
  37. ref.append(eval(ref_list))
  38. return ref
  39. # 封装的绘制主机表格方法
  40. def CreateDiskTable(address,data,section):
  41. merge_format = workbook.add_format(
  42. {'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': '#EEAEEE'})
  43. header_count = len(data[1])
  44. merge_format1 = workbook.add_format(
  45. {'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': '#AEEEEE'})
  46. # 根据磁盘路径计算出表格大小
  47. header_range = "A{}:B{}".format(section,section+header_count)
  48. worksheet.write_row(header_range, data[0], merge_format1) # 显示表头
  49. # 计算合并表头偏移
  50. header_merge_range = "A{}:B{}".format(section,section)
  51. worksheet.merge_range(header_merge_range, "巡检IP地址", merge_format1) # 合并表头(合并第一个元素)
  52. # 计算出地址所占总单元格大小
  53. address_merge_range = "A{}:B{}".format(section+1,section+header_count)
  54. worksheet.merge_range(address_merge_range, address , merge_format) #需要计算出来,根据传入分区数量
  55. # 通过计算得到磁盘路径所对应到表中的位置
  56. merge_format2 = workbook.add_format(
  57. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC'})
  58. index_range = "C{}".format(section+1)
  59. worksheet.write_column(index_range, data[1], merge_format2)
  60. index_range = "C{}:C{}".format(section+1,section+1)
  61. worksheet.set_column(index_range, 30)
  62. # 计算出总容量对应到表中的位置
  63. merge_format3 = workbook.add_format(
  64. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  65. index_range = "D{}".format(section + 1)
  66. worksheet.write_column(index_range, data[2], merge_format3)
  67. index_range = "D{}:D{}".format(section + 1, section + 1)
  68. worksheet.set_column(index_range, 20)
  69. # 计算出剩余容量对应到表中的位置
  70. merge_format4 = workbook.add_format(
  71. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  72. index_range = "E{}".format(section + 1)
  73. worksheet.write_column(index_range, data[3], merge_format4)
  74. index_range = "E{}:E{}".format(section + 1, section + 1)
  75. worksheet.set_column(index_range, 20)
  76. # 计算出利用率对应到表中的位置
  77. merge_format5 = workbook.add_format(
  78. {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  79. index_range = "F{}".format(section + 1)
  80. worksheet.write_column(index_range, data[4], merge_format5)
  81. index_range = "F{}:F{}".format(section + 1, section + 1)
  82. worksheet.set_column(index_range, 20)
  83. # 返回计算后的表格的下两个单元的实际偏移位置
  84. return section + header_count + 3
  85. if __name__ == "__main__":
  86. with open("./unix_disk.db","r") as fp:
  87. fp_file = fp.readlines()
  88. ref_index = 2
  89. for each in fp_file:
  90. data = eval(each)
  91. ref = GetAllDiskSpace(data[0], data[2], data[3], 22)
  92. try:
  93. print("[+] 正在绘制 {} 表格数据,这是一台: {} 主机".format(data[0],data[1]))
  94. # 恒矩阵转树矩阵
  95. ref_xor = list(map(list, zip(*ref)))
  96. header = ["IP地址", "IP地址", "磁盘路径", "已使用", "剩余容量", "利用率"]
  97. # 将表头追加到矩阵头部
  98. ref_xor.insert(0, header)
  99. # 绘制表格,ref_index 递归自身,每次定位到下一个需要更新的表
  100. ref_index = CreateDiskTable(data[0], ref_xor, ref_index)
  101. except Exception:
  102. pass
  103. workbook.close()

绘制内存统计图(柱状图)

简单的案例: 主要统计前十计数信息,先远程拉取数据,然后内部矩阵排序,关联柱状图前十个元素,即可。

  1. import xlsxwriter
  2. workbook = xlsxwriter.Workbook("xxx.xlsx")
  3. worksheet = workbook.add_worksheet()
  4. headings = ["主机地址", "CPU利用率", "内存利用率","交换分区"]
  5. data = [["192.168.1.100", 88, 36,66], ["192.168.1.200", 98, 89,66], ["192.168.1.220", 88, 100,32]]
  6. # 循环添加模拟数据
  7. for i in range(1,100):
  8. s = ["192.168.1.{}".format(i),i,i,i]
  9. data.append(s)
  10. # 定义表格样式
  11. head_style = workbook.add_format({"bold": True, "align": "center", "font": 13})
  12. # 逐条写入数据
  13. worksheet.write_row("A1", headings, head_style)
  14. for i in range(0, len(data)):
  15. worksheet.write_row("A{}".format(i + 2), data[i])
  16. # 添加柱状图
  17. chart = workbook.add_chart({"type": "column"})
  18. chart.add_series({
  19. "name": "=Sheet1!$B$1", # 图例项
  20. "categories": "=Sheet1!$A$2:$A$10", # X轴 Item名称
  21. "values": "=Sheet1!$B$2:$B$10" # X轴Item值
  22. })
  23. chart.add_series({
  24. "name": "=Sheet1!$C$1",
  25. "categories": "=Sheet1!$A$2:$A$10",
  26. "values": "=Sheet1!$C$2:$C$10"
  27. })
  28. chart.add_series({
  29. "name": "=Sheet1!$D$1",
  30. "categories": "=Sheet1!$A$2:$A$10",
  31. "values": "=Sheet1!$D$2:$D$10"
  32. })
  33. # 添加柱状图标题
  34. chart.set_title({"name": "性能统计柱状图"})
  35. chart.set_style(12)
  36. # 在G2处绘制
  37. worksheet.insert_chart("G2", chart)
  38. workbook.close()

先来获取到CPU数据: 通过SSH拉取CPU数据,然后按照最后一个值进行排序,由大到小以此放入二维数组中。

  1. import xlsxwriter
  2. import paramiko
  3. ssh = paramiko.SSHClient()
  4. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  5. def BatchCMD(address,username,password,port,command):
  6. try:
  7. ssh.connect(hostname=address,username=username,password=password,port=port,timeout=2)
  8. stdin , stdout , stderr = ssh.exec_command(command)
  9. result = stdout.read()
  10. if len(result) != 0:
  11. result = str(result).replace("\\n", "\n")
  12. result = result.replace("b'", "").replace("'", "")
  13. return result
  14. else:
  15. return None
  16. except Exception:
  17. return None
  18. def GetMemLoad(address,username,password,port):
  19. ref = []
  20. cmd_dict = {"Linux\n" : "free | grep \"Mem\" | awk '{print $2 \":\" $4}'",
  21. "AIX\n" : "svmon | grep \"memory\" | awk '{print $2 \":\" $4}'"
  22. }
  23. # aix 总大小、剩余大小 需要x4
  24. os_version = BatchCMD(address,username,password,port,"uname")
  25. for version,run_cmd in cmd_dict.items():
  26. if(version == os_version):
  27. os_ref = BatchCMD(address,username,password,port,run_cmd)
  28. ref_list= os_ref.split("\n")
  29. for each in ref_list:
  30. if each != "":
  31. print(each)
  32. return ref
  33. def GetCPULoad(address,username,password,port):
  34. ref = []
  35. # 用户占用,系统占用,空闲
  36. cmd_dict = {"Linux\n" : "vmstat | tail -n 1 | awk '{print $13 \":\" $14 \":\" $15}'",
  37. "AIX\n" : "vmstat | tail -n 1 | awk '{print $14 \":\" $15 \":\" $16}'"
  38. }
  39. os_version = BatchCMD(address,username,password,port,"uname")
  40. for version,run_cmd in cmd_dict.items():
  41. if(version == os_version):
  42. os_ref = BatchCMD(address,username,password,port,run_cmd)
  43. ref_list= os_ref.split("\n")
  44. for each in ref_list:
  45. if each != "":
  46. ref = each.split(":")
  47. ref[2] = str(100 - int(ref[2]))
  48. ref.insert(0,address)
  49. return ref
  50. # 排序函数,以第三列为条件排列
  51. def takeSecond(elem):
  52. return int(elem[3])
  53. if __name__ == "__main__":
  54. workbook = xlsxwriter.Workbook("test1111.xlsx")
  55. worksheet = workbook.add_worksheet()
  56. # 设置头部数据
  57. headings = ["主机地址", "CPU内核态", "CPU用户态", "总利用率"]
  58. head_style = workbook.add_format({"bold": True, "align": "center" ,"fg_color":"#D7E4BC"})
  59. worksheet.write_row("A1", headings, head_style)
  60. # 设置头部列宽
  61. worksheet.set_column("A1:D1",15)
  62. # 统计数据并排序
  63. cpu_data = []
  64. with open("./unix_disk.db","r") as fp:
  65. fp_file = fp.readlines()
  66. for each in fp_file:
  67. try:
  68. data = eval(each)
  69. ref = GetCPULoad(data[0], data[2], data[3], 22)
  70. if(len(ref) !=0):
  71. cpu_data.append(ref)
  72. else:
  73. continue
  74. except Exception:
  75. pass
  76. # 排序,统计第三列数据,将最大的放在最前面,以此向下
  77. cpu_data.sort(key=takeSecond, reverse=True)
  78. print(cpu_data)
  79. for i in range(0, len(cpu_data)):
  80. worksheet.write_row("A{}".format(i + 2), cpu_data[i])
  81. workbook.close()

将绘图方法与SSH结合: 运行后即可统计出机器的所有CPU数据,并将排名前十的机器使用情况列出来。

  1. import xlsxwriter
  2. import paramiko
  3. ssh = paramiko.SSHClient()
  4. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  5. workbook = xlsxwriter.Workbook("test333.xlsx")
  6. worksheet = workbook.add_worksheet()
  7. def BatchCMD(address,username,password,port,command):
  8. try:
  9. ssh.connect(hostname=address,username=username,password=password,port=port,timeout=2)
  10. stdin , stdout , stderr = ssh.exec_command(command)
  11. result = stdout.read()
  12. if len(result) != 0:
  13. result = str(result).replace("\\n", "\n")
  14. result = result.replace("b'", "").replace("'", "")
  15. return result
  16. else:
  17. return None
  18. except Exception:
  19. return None
  20. def GetCPULoad(address,username,password,port):
  21. ref = []
  22. # 用户占用,系统占用,空闲
  23. cmd_dict = {"Linux\n" : "vmstat | tail -n 1 | awk '{print $13 \":\" $14 \":\" $15}'",
  24. "AIX\n" : "vmstat | tail -n 1 | awk '{print $14 \":\" $15 \":\" $16}'"
  25. }
  26. os_version = BatchCMD(address,username,password,port,"uname")
  27. for version,run_cmd in cmd_dict.items():
  28. if(version == os_version):
  29. os_ref = BatchCMD(address,username,password,port,run_cmd)
  30. ref_list= os_ref.split("\n")
  31. for each in ref_list:
  32. if each != "":
  33. ref = each.split(":")
  34. ref[2] = str(100 - int(ref[2]))
  35. ref.insert(0,address)
  36. ref[1] = int(ref[1])
  37. ref[2] = int(ref[2])
  38. ref[3] = int(ref[3])
  39. return ref
  40. # 排序函数,以第三列为条件排列
  41. def takeSecond(elem):
  42. return int(elem[3])
  43. # 添加柱状统计图
  44. def AddGraphical():
  45. # 添加柱状图
  46. chart = workbook.add_chart({"type": "column"})
  47. chart.add_series({
  48. "name": "=Sheet1!$B$1", # 图例项(也就是CPU内核态)
  49. "categories": "=Sheet1!$A$2:$A$10", # X轴 Item名称
  50. "values": "=Sheet1!$B$2:$B$10" # X轴Item值
  51. })
  52. chart.add_series({
  53. "name": "=Sheet1!$C$1",
  54. "categories": "=Sheet1!$A$2:$A$10",
  55. "values": "=Sheet1!$C$2:$C$10"
  56. })
  57. chart.add_series({
  58. "name": "=Sheet1!$D$1",
  59. "categories": "=Sheet1!$A$2:$A$10",
  60. "values": "=Sheet1!$D$2:$D$10"
  61. })
  62. # 添加柱状图标题
  63. chart.set_title({"name": "CPU 性能统计柱状图"})
  64. # chart.set_style(8)
  65. chart.set_x_axis({
  66. 'major_gridlines': {
  67. 'visible': True,
  68. 'line': {'width': 1.25, 'dash_type': 'dash'}
  69. },
  70. })
  71. chart.set_size({'width': 900, 'height': 500})
  72. chart.set_legend({'position': 'top'})
  73. chart.set_table({'show_keys': True})
  74. # 在F2处绘制
  75. worksheet.insert_chart("F2", chart)
  76. if __name__ == "__main__":
  77. # 设置头部数据
  78. headings = ["主机地址", "CPU内核态", "CPU用户态", "总利用率"]
  79. head_style = workbook.add_format({"bold": True, "align": "center" ,"fg_color":"#D7E4BC"})
  80. worksheet.write_row("A1", headings, head_style)
  81. # 设置头部列宽
  82. worksheet.set_column("A1:D1",15)
  83. # 统计数据并排序
  84. cpu_data = []
  85. with open("./unix_disk.db","r") as fp:
  86. fp_file = fp.readlines()
  87. for each in fp_file:
  88. try:
  89. data = eval(each)
  90. ref = GetCPULoad(data[0], data[2], data[3], 22)
  91. if(len(ref) !=0):
  92. print(ref)
  93. cpu_data.append(ref)
  94. else:
  95. continue
  96. except Exception:
  97. pass
  98. # 排序,统计第三列数据,将最大的放在最前面,以此向下
  99. cpu_data.sort(key=takeSecond, reverse=True)
  100. print(cpu_data)
  101. # 将数据批量添加到表格中
  102. for i in range(0, len(cpu_data)):
  103. worksheet.write_row("A{}".format(i + 2), cpu_data[i])
  104. # 开始绘图
  105. AddGraphical()
  106. workbook.close()

收集主机负载(条形图)

制作Excel绘图:

  1. import xlsxwriter
  2. workbook = xlsxwriter.Workbook("xxx.xlsx")
  3. worksheet = workbook.add_worksheet()
  4. headings = ["获取时间", "1分钟负载", "5分钟负载","15分钟负载"]
  5. data = [["12:01", 0.05, 0.7,0.006], ["12:02", 0.5, 0.08,0.06], ["12:03", 0.7, 1,2.1]]
  6. # 定义表格样式
  7. head_style = workbook.add_format({"bold": True, "align": "center" ,"fg_color":"#D7E4BC"})
  8. worksheet.set_column("A1:D1",15)
  9. # 逐条写入数据
  10. worksheet.write_row("A1", headings, head_style)
  11. for i in range(0, len(data)):
  12. worksheet.write_row("A{}".format(i + 2), data[i])
  13. # 添加条形图,显示前十个元素
  14. chart = workbook.add_chart({"type": "line"})
  15. chart.add_series({
  16. "name": "=Sheet1!$B$1", # 图例项
  17. "categories": "=Sheet1!$A$2:$A$10", # X轴 Item名称
  18. "values": "=Sheet1!$B$2:$B$10" # X轴Item值
  19. })
  20. chart.add_series({
  21. "name": "=Sheet1!$C$1",
  22. "categories": "=Sheet1!$A$2:$A$10",
  23. "values": "=Sheet1!$C$2:$C$10"
  24. })
  25. chart.add_series({
  26. "name": "=Sheet1!$D$1",
  27. "categories": "=Sheet1!$A$2:$A$10",
  28. "values": "=Sheet1!$D$2:$D$10"
  29. })
  30. # 添加柱状图标题
  31. chart.set_title({"name": "负载统计条形图"})
  32. # chart.set_style(8)
  33. chart.set_size({'width': 1000, 'height': 500})
  34. chart.set_legend({'position': 'top'})
  35. # 在F2处绘制
  36. worksheet.insert_chart("F2", chart)
  37. workbook.close()

封装SSH执行模块: 封装上方的绘图模块,与SSH模块实现图形绘制,收集十分钟负载。

  1. import xlsxwriter
  2. import paramiko
  3. import datetime
  4. import time
  5. ssh = paramiko.SSHClient()
  6. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  7. workbook = xlsxwriter.Workbook("load_avg.xlsx")
  8. worksheet = workbook.add_worksheet()
  9. def BatchCMD(address,username,password,port,command):
  10. try:
  11. ssh.connect(hostname=address,username=username,password=password,port=port,timeout=2)
  12. stdin , stdout , stderr = ssh.exec_command(command)
  13. result = stdout.read()
  14. if len(result) != 0:
  15. result = str(result).replace("\\n", "\n")
  16. result = result.replace("b'", "").replace("'", "")
  17. return result
  18. else:
  19. return None
  20. except Exception:
  21. return None
  22. def GetCPUAvg(address,username,password,port):
  23. ref = []
  24. cmd_dict = {"Linux\n" : "cat /proc/loadavg | awk '{print $1 \":\" $2 \":\" $3}'",
  25. "AIX\n" : "vmstat | tail -n 1 | awk '{print $14 \":\" $15 \":\" $16}'"
  26. }
  27. os_version = BatchCMD(address,username,password,port,"uname")
  28. for version,run_cmd in cmd_dict.items():
  29. if(version == os_version):
  30. os_ref = BatchCMD(address,username,password,port,run_cmd)
  31. ref_list= os_ref.split("\n")
  32. for each in ref_list:
  33. if each != "":
  34. ref = each.split(":")
  35. str_to_date = datetime.datetime.now()
  36. now_date = str(str_to_date.minute) + ":" + str(str_to_date.second)
  37. ref.insert(0,now_date)
  38. ref[1] = float(ref[1])
  39. ref[2] = float(ref[2])
  40. ref[3] = float(ref[3])
  41. return ref
  42. # 绘制聚合图形
  43. def AddGraphical(data):
  44. #data = [["12:01", 0.05, 0.7, 0.006], ["12:02", 0.5, 0.08, 0.06], ["12:03", 0.7, 1, 2.1]]
  45. # 定义表格样式
  46. head_style = workbook.add_format({"bold": True, "align": "center", "fg_color": "#D7E4BC"})
  47. worksheet.set_column("A1:D1", 15)
  48. # 逐条写入数据
  49. headings = ["获取时间", "1分钟负载", "5分钟负载", "15分钟负载"]
  50. worksheet.write_row("A1", headings, head_style)
  51. for i in range(0, len(data)):
  52. worksheet.write_row("A{}".format(i + 2), data[i])
  53. # 添加条形图,显示前十个元素
  54. chart = workbook.add_chart({"type": "line"})
  55. chart.add_series({
  56. "name": "=Sheet1!$B$1", # 图例项
  57. "categories": "=Sheet1!$A$2:$A$10", # X轴 Item名称
  58. "values": "=Sheet1!$B$2:$B$10" # X轴Item值
  59. })
  60. chart.add_series({
  61. "name": "=Sheet1!$C$1", # 第一个线条(图例)
  62. "categories": "=Sheet1!$A$2:$A$10",
  63. "values": "=Sheet1!$C$2:$C$10"
  64. })
  65. chart.add_series({
  66. "name": "=Sheet1!$D$1", # 第二个线条(图例)
  67. "categories": "=Sheet1!$A$2:$A$10",
  68. "values": "=Sheet1!$D$2:$D$10"
  69. })
  70. # 添加柱状图标题
  71. chart.set_title({"name": "负载统计条形图"})
  72. # chart.set_style(8)
  73. chart.set_size({'width': 900, 'height': 500})
  74. chart.set_legend({'position': 'top'})
  75. # 在F2处绘制
  76. worksheet.insert_chart("F2", chart)
  77. # 收集10分钟的负载数据
  78. def GetLoad():
  79. ref_date = []
  80. for item in range(10):
  81. ret = GetCPUAvg("192.168.1.11", "root", "123123", "22")
  82. ref_date.append(ret)
  83. time.sleep(60)
  84. print(ret)
  85. return ref_date
  86. if __name__ == "__main__":
  87. date = []
  88. date = GetLoad()
  89. AddGraphical(date)
  90. workbook.close()

绘制设备种类(饼状图)

制作Excel绘图: 先来实现绘图。

  1. import xlsxwriter
  2. workbook = xlsxwriter.Workbook("pie.xlsx")
  3. worksheet = workbook.add_worksheet()
  4. data = [["Suse", 30 ], ["Centos",25], ["AIX",15]]
  5. # 定义表格样式
  6. head_style = workbook.add_format({"bold": True, "align": "center" ,"fg_color":"#D7E4BC"})
  7. worksheet.set_column("A1:D1",15)
  8. # 逐条写入数据
  9. headings = ["系统版本", "数量"]
  10. worksheet.write_row("A1", headings, head_style)
  11. for i in range(0, len(data)):
  12. worksheet.write_row("A{}".format(i + 2), data[i])
  13. # 添加条形图,显示前十个元素
  14. chart = workbook.add_chart({"type": "pie"})
  15. chart.add_series({
  16. "name": "=Sheet1!$B$1", # 图例项
  17. "categories": "=Sheet1!$A$2:$A$4", # X轴 Item名称
  18. "values": "=Sheet1!$B$2:$B$4" # X轴Item值
  19. })
  20. # 添加饼状图
  21. chart.set_title({"name": "系统版本分布"})
  22. chart.set_size({'width': 600, 'height': 300})
  23. chart.set_legend({'position': 'right'})
  24. # 在D2处绘制
  25. worksheet.insert_chart("D2", chart)
  26. workbook.close()

实现收集数据并绘图: 收集数据就不写了,主要说说统计个数,我们可以每次收集到数据后放入一个列表中,最后使用set集合将其自动去重,去重后在对特定的值进行计数统计即可。

  1. data = ["Windows 10","Windows 10","Windows 7","Windows 7","Suse","AIX","AIX"]
  2. dic = {}
  3. for each in set(data):
  4. dic[each] = data.count(each)
  5. print(dic)

继续实现绘图即可。

  1. import xlsxwriter
  2. workbook = xlsxwriter.Workbook("pie.xlsx")
  3. worksheet = workbook.add_worksheet()
  4. # 去重后的数据在dic
  5. data = ["Windows 10","Windows 10","Windows 7","Windows 7","Suse","AIX","AIX"]
  6. dic = {}
  7. for each in set(data):
  8. dic[each] = data.count(each)
  9. print("构建字典: {}".format(dic))
  10. print("字典数: {}".format(len(dic)))
  11. # 字典转列表
  12. new_data = []
  13. for k,v in dic.items():
  14. new_list = [k,v]
  15. new_data.append(new_list)
  16. print("字典转为列表:{}".format(new_data))
  17. #data = [["Suse", 30 ], ["Centos",25], ["AIX",15]]
  18. # 定义表格样式
  19. head_style = workbook.add_format({"bold": True, "align": "center" ,"fg_color":"#D7E4BC"})
  20. worksheet.set_column("A1:D1",15)
  21. # 逐条写入数据
  22. headings = ["系统版本", "数量"]
  23. worksheet.write_row("A1", headings, head_style)
  24. for i in range(0, len(new_data)):
  25. worksheet.write_row("A{}".format(i + 2), new_data[i])
  26. # 添加饼状图图例
  27. chart = workbook.add_chart({"type": "pie"})
  28. chart.add_series({
  29. "name": "=Sheet1!$B$1", # 图例项
  30. "categories": "=Sheet1!$A$2:$A${}".format(len(dic)+1), # X轴 Item名称
  31. "values": "=Sheet1!$B$2:$B${}".format(len(dic)+1) # X轴Item值
  32. })
  33. # 添加饼状图
  34. chart.set_title({"name": "系统版本分布"})
  35. chart.set_size({'width': 600, 'height': 300})
  36. chart.set_legend({'position': 'right'})
  37. # 在D2处绘制
  38. worksheet.insert_chart("D2", chart)
  39. workbook.close()

Python 使用xlsxwriter绘制Excel表格的更多相关文章

  1. Python将多个excel表格合并为一个表格

    Python将多个excel表格合并为一个表格 生活中经常会碰到多个excel表格汇总成一个表格的情况,比如你发放了一份表格让班级所有同学填写,而你负责将大家的结果合并成一个.诸如此类的问题有很多.除 ...

  2. Python导出数据到Excel表格-NotImplementedError: formatting_info=True not yet implemented

    在使用Python写入数据到Excel表格中时出现报错信息记录:“NotImplementedError: formatting_info=True not yet implemented” 报错分析 ...

  3. Python 操作csv和excel表格

    1. 操作csv表格 使用的库 csv 1. csv文件里读取数据 代码 1. 以列表形式打开 import csv f = open('csv_test.csv', 'r') # 打开csv文件 c ...

  4. Python三个处理excel表格的库

    三个向excel表格写入数的库:xlwt,xlsxwriter,openpyxl,代码如下: 1 #第一个库,xlwt,不能写超过256列的表格 2 import xlwt 3 4 #新建workbo ...

  5. Python 使用openpyxl导出Excel表格的时候,使用save()保存到指定路径

    在使用openpyxl导出Excel表格的使用,如何指定导出的路径呢. 使用sava(filename),会保存到当前执行文件的路径下. 使用sava("/tmp/{}.xlsx" ...

  6. Python脚本:实现excel表格导入到数据库,支持mysql,postgresql,MongoDB

    import xlrd,re from datetime import datetime from xlrd import xldate_as_tuple # 判断上传表格是否与模板要求一致 def ...

  7. Python利用xlutils统计excel表格数据

    假设有像上这样一个表格,里面装满了各式各样的数据,现在要利用模板对它进行统计每个销售商的一些数据的总和.模板如下: 代码开始: 1 #!usr/bin/python3 2 # -*-coding=ut ...

  8. python XlsxWriter创建Excel 表格

    文档(英文) https://xlsxwriter.readthedocs.io/index.html 常用模块说明(中文) https://blog.csdn.net/sinat_35930259/ ...

  9. Python使用openpyxl操作excel表格

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 ht ...

随机推荐

  1. 一个页面中多个window.onload = function(){}冲突问题解决思路

    转: 一个页面中多个window.onload = function(){}冲突问题解决思路 一个页面中多个window.onload = function(){}冲突问题解决思路 参考文章: (1) ...

  2. SQL-MYSQL的时间格式转换(持续补充)

    ======================SQLSERVER===================================== SELECT CONVERT(varchar(100), GE ...

  3. 2020 年安装 FreeBSD 系统的基础视频

    B 站搜索 BV14i4y137mh 包含了下载,虚拟机安装,配置 SSH 等教程. https://www.bilibili.com/video/BV14i4y137mh

  4. Codeforces Round #574 (Div. 2) D2. Submarine in the Rybinsk Sea (hard edition) 【计算贡献】

    一.题目 D2. Submarine in the Rybinsk Sea (hard edition) 二.分析 相比于简单版本,它的复杂地方在于对于不同长度,可能对每个点的贡献可能是有差异的. 但 ...

  5. SpringBoot自动配置探究

    @SpringBootApplication @SpringBootApplication表示SpringBoot应用,标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就 ...

  6. Linux系统(Centos7)最新版本Docker简易(yum)安装步骤

    Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施.容器 ...

  7. 一种3位sar adc仿真验证

    3位sar adc采用下图的电容阵列,电路如下图:所有电容的正端(也称为上极板)与比较器的同相端连接,比较器反相端接gnd,其工作过程进行大致分析见之前的文章<一种3位sar adc工作过程推导 ...

  8. Java 给PPT添加动画效果(预设动画/自定义动画)

    PPT幻灯片中对形状可设置动画效果,常见的动画效果为内置的固定类型,即动画效果和路径是预先设定好的固定模板,但在设计动画效果时,用户也可以按照自己的喜好自定义动画动作路径.下面,通过Java后端程序代 ...

  9. python那些需要知道的事儿——逻辑运算与比大小

    一.逻辑运算 逻辑运算符: and   or   not,结果为布尔值(True和False) 1.基本逻辑运算符介绍 not :将后面的逻辑运算结果取反 >>> not 1 < ...

  10. [Azure Devops] 使用 Azure Repos 管理代码

    1. 什么是 Azure Repos Azure Repos 是一组版本控制工具,可用于管理代码.无论您的软件项目是大型项目还是小型项目,都应尽快使用版本控制. 版本控制系统是可帮助您跟踪随时间变化对 ...