翼度科技»论坛 编程开发 python 查看内容

Python 使用XlsxWriter操作Excel

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
在数据处理和报告生成的领域中,Excel 文件一直是广泛使用的标准格式。为了让 Python 开发者能够轻松创建和修改 Excel 文件,XlsxWriter 库应运而生。XlsxWriter 是一个功能强大的 Python 模块,专门用于生成 Microsoft Excel 2007及以上版本(.xlsx 格式)的电子表格文件。本文将对XlsxWriter进行概述,探讨其主要特点、用法和一些实际应用,并实现绘制各类图例(条形图,柱状图,饼状图)等。
主要特点


  • .xlsx 格式支持: XlsxWriter 专注于创建 Microsoft Excel 2007 及以上版本的文件,这是一种基于 XML 的格式,允许存储大量数据、样式和图表。
  • 格式和样式: XlsxWriter 允许开发者以编程方式设置单元格的格式和样式,包括字体、颜色、对齐方式等。这使得生成的 Excel 文件能够呈现出精美的外观。
  • 图表和图形: XlsxWriter 支持创建各种类型的图表,如折线图、柱状图、饼图等,使用户能够直观地呈现数据。同时,它还支持插入图片、形状和注释等图形元素。
  • 公式和函数: XlsxWriter 允许在单元格中使用 Excel 公式和函数,这对于进行复杂的计算和数据分析非常有用。
  • 大数据量处理: XlsxWriter 被设计为高性能的库,能够处理大规模的数据集,同时保持生成的 Excel 文件的高质量。
  • 图表和条件格式: 除了基本的单元格样式,XlsxWriter 支持添加条件格式,以及在工作表中插入图表,提供更直观的数据可视化。
安装模块

要开始使用 XlsxWriter,首先需要安装该库。可以通过以下命令使用 pip 安装:
  1. pip install XlsxWriter
复制代码
XlsxWriter 提供了一个强大而灵活的工具,使得使用 Python 生成 Excel 文件变得简单而高效。无论是用于数据分析、报告生成还是其他领域,XlsxWriter 都为开发者提供了一种简单而可靠的方法,使他们能够充分利用 Excel 的强大功能。在掌握了基本用法后,开发者可以深入研究 XlsxWriter 的高级特性,以满足更复杂的需求。
单行输出函数

函数WriteSingleArticle()调用时传入文档名称,以及传入表头和数据,写出简单的单行记录。
  1. import xlsxwriter
  2. # 写出数据
  3. def WriteSingleArticle(xls_name,header,data):
  4.     workbook = xlsxwriter.Workbook(xls_name)
  5.     worksheet = workbook.add_worksheet()
  6.     # 定义表格样式
  7.     head_style = workbook.add_format({"bold": True, "align": "center", "border": 1, "fg_color": "#D7E4BC"})
  8.     worksheet.set_column("A1:D1", 15)
  9.     # 写出表头
  10.     worksheet.write_row("A1", header, head_style)
  11.     for index in range(0, len(data)):
  12.         worksheet.write_row("A{}".format(index + 2), data[index])
  13.     workbook.close()
  14.     return True
  15. if __name__ == "__main__":
  16.     headings = ["用户名", "密码", "地址"]
  17.     data = [["admin","123456","192.168.1.1"],["admin","123456","192.168.1.1"]]
  18.     ref = WriteSingleArticle("lyshark.xlsx",headings,data)
  19.     print("写出状态: {}".format(ref))
复制代码
输出效果如下所示;

多行表格输出函数

函数CreateTable(address,data,section)实现了输出一个列表格式的Table,只需传入列表序列即可。
先找到表格生成坐标与大小之间的比值关系,这是第一步,如下是简单的实现固定位置生成表格。
  1. import xlsxwriter
  2. # 设置表格sheet名称
  3. workbook = xlsxwriter.Workbook('lyshark.xlsx')
  4. worksheet = workbook.add_worksheet("系统磁盘统计")
  5. # 设置头部标题IP地址列
  6. merge_format = workbook.add_format({'bold': True,'border': 1,'align': 'center','valign': 'vcenter','fg_color': '#EEAEEE'})
  7. worksheet.merge_range('A9:B12', '192.168.1.1', merge_format)
  8. # 设置表格头部提示,并将前两个表头合并为1个
  9. header = ["IP地址","IP地址","路径","总容量","剩余容量","利用率"]
  10. merge_format1 = workbook.add_format({'bold': True,'border': 1,'align': 'center','valign': 'vcenter','fg_color': '#AEEEEE'})
  11. worksheet.write_row("A8:B12",header,merge_format1)        # 显示表头
  12. worksheet.merge_range('A8:B8',"IP地址",merge_format1)      # 合并表头(合并第一个元素)
  13. # 写出路径列表
  14. data1 = ["/etc/system/","/proc/","/sys","/var/lyshark"]
  15. merge_format2 = workbook.add_format({'bold': True,'border': 1,'valign': 'vcenter','fg_color': '#D7E4BC','align': 'center'})
  16. worksheet.write_column("C9",data1,merge_format2)
  17. worksheet.set_column("C9:C9",30)
  18. # 写出总容量
  19. data2 = ["1024 GB","2048 GB","111 GB","1111 GB"]
  20. merge_format3 = workbook.add_format({'bold': True,'border': 1,'valign': 'vcenter','fg_color': '#D7E4BC','align': 'center'})
  21. worksheet.write_column("D9",data2,merge_format3)
  22. worksheet.set_column("D9:D9",20)
  23. # 写出剩余容量
  24. data3 = ["1024 GB","2048 GB","111 GB","22 GB"]
  25. merge_format4 = workbook.add_format({'bold': True,'border': 1,'valign': 'vcenter','fg_color': '#D7E4BC','align': 'center'})
  26. worksheet.write_column("E9",data3,merge_format4)
  27. worksheet.set_column("E9:E9",20)
  28. # 写出利用率
  29. data4= ["10%","50%","20%","33%"]
  30. merge_format5 = workbook.add_format({'bold': True,'border': 1,'valign': 'vcenter','fg_color': '#D7E4BC','align': 'center'})
  31. worksheet.write_column("F9",data4,merge_format5)
  32. worksheet.set_column("F9:F9",20)
  33. workbook.close()
复制代码
输出效果如下所示;

继续封装如上代码,将其封装为CreateTable(address,data,section)函数,用户传入表头地址,数据集,以及从第几行开始写数据,则自动生成表单。
  1. import xlsxwriter
  2. workbook = xlsxwriter.Workbook('lyshark.xlsx')
  3. worksheet = workbook.add_worksheet("统计表")
  4. # 创建表结构
  5. def CreateTable(address,data,section):
  6.     # --------------------------------------------------------------------
  7.     # 计算表头列表长度
  8.     header_count = len(data[1])
  9.     print("不带表头的列表长度: {}".format(header_count))
  10.     merge_format1 = workbook.add_format({'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': '#AEEEEE'})
  11.     # 根据表格列长度 计算出表格大小
  12.     header_range = f"A{section}:B{section+header_count}"
  13.     print("表头总长度 header_range = {}".format(header_range))
  14.     # 写出表头到文件
  15.     worksheet.write_row(header_range, data[0], merge_format1)
  16.     # --------------------------------------------------------------------
  17.     # 计算合并表头偏移,并合并
  18.     header_merge_range = f"A{section}:B{section}"
  19.     print("合并表头偏移 header_merge_range = {}".format(header_merge_range))
  20.     # 合并表头(合并第一个元素)
  21.     header_table = data[0][0]
  22.     worksheet.merge_range(header_merge_range, header_table, merge_format1)
  23.     # worksheet.merge_range(header_merge_range, "IP地址", merge_format1)
  24.     # --------------------------------------------------------------------
  25.     # 计算出表头 所占总单元格大小
  26.     remove_header_count = len(data) - 1
  27.     print("除去表头的列表长度: {}".format(remove_header_count))
  28.     # 此处自己调整列长度
  29.     address_merge_range = f"A{section+1}:B{section  + len(data[0][1])}"
  30.     print("所占总单元格大小 address_merge_range = {} => {}".format(len(data[0][1]),address_merge_range))
  31.     merge_format = workbook.add_format({'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': '#EEAEEE'})
  32.     # 写出单元格合并大小
  33.     worksheet.merge_range(address_merge_range, address , merge_format)
  34.     # --------------------------------------------------------------------
  35.     # 循环填充数据
  36.     merge_format_index = workbook.add_format(
  37.         {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  38.     letter_list = ['C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
  39.                    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
  40.     # 循环填充数据 最大字段长度为24
  41.     for index in range(0, remove_header_count):
  42.         index_range = f"{letter_list[index]}{section+1}"
  43.         worksheet.write_column(index_range, data[index+1], merge_format_index)
  44.         index_range = f"{letter_list[index]}{section+1}:{letter_list[index]}{section+1}"
  45.         worksheet.set_column(index_range, 30)
  46.     """
  47.         #  不使用循环逐条填充
  48.         merge_format2 = workbook.add_format( {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  49.         index_range = "C{}".format(section+1)
  50.         worksheet.write_column(index_range, data[1], merge_format2)
  51.         index_range = "C{}:C{}".format(section+1,section+1)
  52.         worksheet.set_column(index_range, 30)
  53.         index_range = "D{}".format(section+1)
  54.         worksheet.write_column(index_range, data[2], merge_format2)
  55.         index_range = "D{}:D{}".format(section+1,section+1)
  56.         worksheet.set_column(index_range, 30)
  57.         index_range = "E{}".format(section+1)
  58.         worksheet.write_column(index_range, data[2], merge_format2)
  59.         index_range = "E{}:E{}".format(section+1,section+1)
  60.         worksheet.set_column(index_range, 30)
  61.     """
  62.     # 返回计算后的表格的下两个单元的实际偏移位置
  63.     return section + remove_header_count + 3
  64. # 测试恒矩阵
  65. def Test():
  66.     val = \
  67.     [
  68.         ["测试地址", "测试地址","磁盘路径", "总容量", "剩余容量"],
  69.         ["/etc/system/", "/proc/", "/sys", "/user"],
  70.         ["1024 GB", "2048 GB", "12 GB","98 GB"],
  71.         ["1345 GB", "1124 GB", "341 GB", "55 GB"]
  72.     ]
  73.     ref = CreateTable("192.168.1.1",val,1)
  74.     print("返回下一个表格索引: {}".format(ref))
  75.     ref = CreateTable("192.168.1.1",val,ref)
  76.     print("返回下一个表格索引: {}".format(ref))
  77.     workbook.close()
  78. # 测试竖矩阵
  79. def Test2():
  80.     header = ["测试地址", "测试地址","磁盘路径", "总容量", "剩余容量"]
  81.     val = \
  82.     [
  83.         ["/etc/system/", "1024 GB", "256 GB"],
  84.         ["/etc/passwd/", "104 GB", "345GB"],
  85.         ["/etc/username/", "12 GB", "56 GB"],
  86.         ["/etc/lyshark/", "12 GB", "56 GB"]
  87.     ]
  88.     # 横向矩阵转竖向矩阵
  89.     ref_xor = list ( map(list,zip(*val)) )
  90.     # 追加头部
  91.     ref_xor.insert(0, header)
  92.     print(ref_xor)
  93.     ref = CreateTable("192.168.1.1",ref_xor,1)
  94.     print("返回下一个表格索引: {}".format(ref))
  95.     workbook.close()
  96. if __name__ == "__main__":
  97.     Test2()
复制代码
输出效果如下所示;

柱状图输出函数

简单实现CreateChart(headings,data)柱状图生成函数,通过传入头部标题和数据集列表即可完成表单生成。
  1. import xlsxwriter
  2. workbook = xlsxwriter.Workbook('lyshark.xlsx')
  3. worksheet = workbook.add_worksheet("统计表")
  4. def CreateChart(headings,data):
  5.     # 定义表格样式
  6.     head_style = workbook.add_format({"bold": True, "align": "center", "font": 13})
  7.     # 逐条写入数据
  8.     worksheet.write_row("A1", headings, head_style)
  9.     for i in range(0, len(data)):
  10.         worksheet.write_row("A{}".format(i + 2), data[i])
  11.     # 添加柱状图
  12.     chart = workbook.add_chart({"type": "column"})
  13.     chart.add_series({
  14.         "name": "=统计表!$B$1",              # 图例项
  15.         "categories": "=统计表!$A$2:$A$10",  # X轴Item名称
  16.         "values": "=统计表!$B$2:$B$10"       # X轴Item值
  17.     })
  18.     chart.add_series({
  19.         "name": "=统计表!$C$1",
  20.         "categories": "=统计表!$A$2:$A$10",
  21.         "values": "=统计表!$C$2:$C$10"
  22.     })
  23.     chart.add_series({
  24.         "name": "=统计表!$D$1",
  25.         "categories": "=统计表!$A$2:$A$10",
  26.         "values": "=统计表!$D$2:$D$10"
  27.     })
  28.     # 添加柱状图标题
  29.     chart.set_title({"name": "性能统计柱状图"})
  30.     chart.set_style(12)
  31.     # 在G2处绘制
  32.     worksheet.insert_chart("G2", chart)
  33.     workbook.close()
  34. if __name__ == "__main__":
  35.     headings = ["主机地址", "CPU利用率", "内存利用率", "交换分区"]
  36.     data = [["192.168.1.100", 88, 36, 66], ["192.168.1.200", 98, 89, 66], ["192.168.1.220", 88, 100, 32]]
  37.     # 循环添加模拟数据
  38.     for i in range(1, 100):
  39.         s = ["192.168.1.{}".format(i), i, i, i]
  40.         data.append(s)
  41.     CreateChart(headings,data)
复制代码
输出效果如下所示;

条形图输出函数

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

饼状图输出函数

函数CreateChart(headings,data)用于生成饼状图,实现对主机以及主机数量的图形化展示。
  1. import xlsxwriter
  2. workbook = xlsxwriter.Workbook('lyshark.xlsx')
  3. worksheet = workbook.add_worksheet("统计表")
  4. def CreateChart(headings,data):
  5.     # 定义表格样式
  6.     head_style = workbook.add_format({"bold": True, "align": "center", "fg_color": "#D7E4BC"})
  7.     worksheet.set_column("A1:D1", 15)
  8.     # 逐条写入数据
  9.     worksheet.write_row("A1", headings, head_style)
  10.     for i in range(0, len(data)):
  11.         worksheet.write_row("A{}".format(i + 2), data[i])
  12.     # 添加条形图,显示前十个元素
  13.     chart = workbook.add_chart({"type": "pie"})
  14.     chart.add_series({
  15.         "name": "=统计表!$B$1",             # 图例项
  16.         "categories": "=统计表!$A$2:$A$4",  # X轴 Item名称
  17.         "values": "=统计表!$B$2:$B$4"       # X轴Item值
  18.     })
  19.     # 添加饼状图
  20.     chart.set_title({"name": "系统版本分布"})
  21.     chart.set_size({'width': 600, 'height': 300})
  22.     chart.set_legend({'position': 'right'})
  23.     # 在D2处绘制
  24.     worksheet.insert_chart("D2", chart)
  25.     workbook.close()
  26. if __name__ == "__main__":
  27.     headings = ["系统版本", "数量"]
  28.     data = [["Suse", 30], ["Centos", 25], ["AIX", 15]]
  29.     CreateChart(headings,data)
复制代码
输出效果如下所示;

实现绘图类

通过调用xlsxwriter第三方库,实现绘制各类通用图形,并保存为XLS文档格式.
  1. import xlsxwriter
  2. class DrawChart():
  3.     def __init__(self,workbook):
  4.         self.workbook = xlsxwriter.Workbook(workbook)
  5.     # 排序函数,以第三列为条件排列
  6.     def cpu_takeSecond(self,elem):
  7.         return int(elem[3])
  8.     def mem_taskSecond(self,elem):
  9.         return int(elem[1])
  10.     # 封装统计主机磁盘使用情况
  11.     def CreateDiskTable(self,worksheet,address,data,section):
  12.         # 添加统计名称 例如: 磁盘统计
  13.         worksheet = self.workbook.add_worksheet(worksheet)
  14.         merge_format = self.workbook.add_format(
  15.             {'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': '#EEAEEE'})
  16.         header_count = len(data[1])
  17.         merge_format1 = self.workbook.add_format(
  18.             {'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': '#AEEEEE'})
  19.         # 根据磁盘路径计算出表格大小
  20.         header_range = "A{}:B{}".format(section,section+header_count)
  21.         worksheet.write_row(header_range, data[0], merge_format1)  # 显示表头
  22.         # 计算合并表头偏移
  23.         header_merge_range = "A{}:B{}".format(section,section)
  24.         worksheet.merge_range(header_merge_range, "巡检IP地址", merge_format1)  # 合并表头(合并第一个元素)
  25.         # 计算出地址所占总单元格大小
  26.         address_merge_range = "A{}:B{}".format(section+1,section+header_count)
  27.         worksheet.merge_range(address_merge_range, address , merge_format)  #需要计算出来,根据传入分区数量
  28.         # 通过计算得到磁盘路径所对应到表中的位置
  29.         merge_format2 = self.workbook.add_format(
  30.             {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC'})
  31.         index_range = "C{}".format(section+1)
  32.         worksheet.write_column(index_range, data[1], merge_format2)
  33.         index_range = "C{}:C{}".format(section+1,section+1)
  34.         worksheet.set_column(index_range, 30)
  35.         # 计算出总容量对应到表中的位置
  36.         merge_format3 = self.workbook.add_format(
  37.             {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  38.         index_range = "D{}".format(section + 1)
  39.         worksheet.write_column(index_range, data[2], merge_format3)
  40.         index_range = "D{}:D{}".format(section + 1, section + 1)
  41.         worksheet.set_column(index_range, 20)
  42.         # 计算出剩余容量对应到表中的位置
  43.         merge_format4 = self.workbook.add_format(
  44.             {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  45.         index_range = "E{}".format(section + 1)
  46.         worksheet.write_column(index_range, data[3], merge_format4)
  47.         index_range = "E{}:E{}".format(section + 1, section + 1)
  48.         worksheet.set_column(index_range, 20)
  49.         # 计算出利用率对应到表中的位置
  50.         merge_format5 = self.workbook.add_format(
  51.             {'bold': True, 'border': 1, 'valign': 'vcenter', 'fg_color': '#D7E4BC', 'align': 'center'})
  52.         index_range = "F{}".format(section + 1)
  53.         worksheet.write_column(index_range, data[4], merge_format5)
  54.         index_range = "F{}:F{}".format(section + 1, section + 1)
  55.         worksheet.set_column(index_range, 20)
  56.         # 返回计算后的表格的下两个单元的实际偏移位置
  57.         return section + header_count + 3
  58.     # 创建CPU利用率百分比,并统计前十
  59.     def CreateCpuUsedTable(self,worksheet,header,data):
  60.         worksheet = self.workbook.add_worksheet(worksheet)
  61.         # 设置头部颜色,并写入头部数据
  62.         head_style = self.workbook.add_format({"bold": True, "align": "center", "fg_color": "#D7E4BC"})
  63.         worksheet.write_row("A1", header, head_style)
  64.         # 设置头部列宽
  65.         worksheet.set_column("A1:D1", 15)
  66.         # 排序,统计第三列数据,将最大的放在最前面,以此向下
  67.         data.sort(key=self.cpu_takeSecond, reverse=True)
  68.         # 将数据批量添加到表格中
  69.         for x in range(0,len(data)):
  70.             worksheet.write_row("A{}".format(x + 2), data[x])
  71.         # --------------------------------------------------------------
  72.         # 添加柱状图(开始绘图)
  73.         chart = self.workbook.add_chart({"type": "column"})
  74.         chart.add_series({
  75.             "name": "=CPU利用率!$B$1",              # 图例项(也就是CPU内核态)
  76.             "categories": "=CPU利用率!$A$2:$A$10",  # X轴 Item名称
  77.             "values": "=CPU利用率!$B$2:$B$10"       # X轴Item值
  78.         })
  79.         chart.add_series({
  80.             "name": "=CPU利用率!$C$1",
  81.             "categories": "=CPU利用率!$A$2:$A$10",
  82.             "values": "=CPU利用率!$C$2:$C$10"
  83.         })
  84.         chart.add_series({
  85.             "name": "=CPU利用率!$D$1",
  86.             "categories": "=CPU利用率!$A$2:$A$10",
  87.             "values": "=CPU利用率!$D$2:$D$10"
  88.         })
  89.         # 添加柱状图标题
  90.         chart.set_title({"name": "CPU 性能统计柱状图"})
  91.         # chart.set_style(8)
  92.         chart.set_x_axis({
  93.             'major_gridlines': {
  94.                 'visible': True,
  95.                 'line': {'width': 1.25, 'dash_type': 'dash'}
  96.             },
  97.         })
  98.         chart.set_size({'width': 900, 'height': 500})
  99.         chart.set_legend({'position': 'top'})
  100.         chart.set_table({'show_keys': True})
  101.         # 在F2处绘制
  102.         worksheet.insert_chart("F2", chart)
  103.     # 内存利用率统计
  104.     def CreateMemoryTable(self, worksheet, header, data):
  105.         worksheet = self.workbook.add_worksheet(worksheet)
  106.         # 设置头部颜色,并写入头部数据
  107.         head_style = self.workbook.add_format({"bold": True, "align": "center", "fg_color": "#D7E4BC"})
  108.         worksheet.write_row("A1", header, head_style)
  109.         # 设置头部列宽
  110.         worksheet.set_column("A1:D1", 15)
  111.         # 排序,统计第三列数据,将最大的放在最前面,以此向下
  112.         data.sort(key=self.mem_taskSecond, reverse=True)
  113.         # 将数据批量添加到表格中
  114.         for x in range(0,len(data)):
  115.             worksheet.write_row("A{}".format(x + 2), data[x])
  116.         # --------------------------------------------------------------
  117.         # 添加柱状图(横向图)
  118.         chart = self.workbook.add_chart({"type": "bar"})
  119.         chart.add_series({
  120.             "name": "=内存利用率!$B$1",
  121.             "categories": "=内存利用率!$A$2:$A$10",
  122.             "values": "=内存利用率!$B$2:$B$10"
  123.         })
  124.         chart.add_series({
  125.             "name": "=内存利用率!$C$1",
  126.             "categories": "=内存利用率!$A$2:$A$10",
  127.             "values": "=内存利用率!$C$2:$C$10"
  128.         })
  129.         # 添加柱状图标题
  130.         chart.set_title({"name": "内存利用率统计图"})
  131.         chart.set_x_axis({
  132.             'major_gridlines': {
  133.                 'visible': True,
  134.                 'line': {'width': 1.25, 'dash_type': 'dash'}
  135.             },
  136.         })
  137.         chart.set_size({'width': 900, 'height': 400})
  138.         chart.set_legend({'position': 'top'})
  139.         # 在F2处绘制
  140.         worksheet.insert_chart("F2", chart)
  141.     # --------------------------------------------------------------
  142.     # 统计CPU Load 负载情况 注意: 只能指定单独的主机
  143.     def CreateCpuLoadAvgTable(self, address,worksheet, header, data):
  144.         worksheet = self.workbook.add_worksheet(worksheet)
  145.         # 设置头部颜色,并写入头部数据
  146.         head_style = self.workbook.add_format({"bold": True, "align": "center", "fg_color": "#D7E4BC"})
  147.         worksheet.write_row("A1", header, head_style)
  148.         # 设置头部列宽
  149.         worksheet.set_column("A1:D1", 15)
  150.         # 将数据批量添加到表格中
  151.         for x in range(0,len(data)):
  152.             worksheet.write_row("A{}".format(x + 2), data[x])
  153.         # 定义表格样式
  154.         head_style = self.workbook.add_format({"bold": True, "align": "center", "fg_color": "#D7E4BC"})
  155.         worksheet.set_column("A1:D1", 15)
  156.         # 逐条写入数据
  157.         worksheet.write_row("A1", header, head_style)
  158.         for i in range(0, len(data)):
  159.             worksheet.write_row("A{}".format(i + 2), data[i])
  160.         # 添加条形图,显示前十个元素
  161.         chart = self.workbook.add_chart({"type": "line"})
  162.         chart.add_series({
  163.             "name": "=CPU负载数据统计!$B$1",  # 图例项
  164.             "categories": "=CPU负载数据统计!$A$2:$A$10",  # X轴 Item名称
  165.             "values": "=CPU负载数据统计!$B$2:$B$10"  # X轴Item值
  166.         })
  167.         chart.add_series({
  168.             "name": "=CPU负载数据统计!$C$1",  # 第一个线条(图例)
  169.             "categories": "=CPU负载数据统计!$A$2:$A$10",
  170.             "values": "=CPU负载数据统计!$C$2:$C$10"
  171.         })
  172.         chart.add_series({
  173.             "name": "=CPU负载数据统计!$D$1",  # 第二个线条(图例)
  174.             "categories": "=CPU负载数据统计!$A$2:$A$10",
  175.             "values": "=CPU负载数据统计!$D$2:$D$10"
  176.         })
  177.         # 添加柱状图标题
  178.         chart.set_title({"name": "统计地址: {}".format(address)})
  179.         chart.set_size({'width': 900, 'height': 500})
  180.         chart.set_legend({'position': 'top'})
  181.         # 在F2处绘制
  182.         worksheet.insert_chart("F2", chart)
  183.     # 关闭并保存绘制结果
  184.     def Save(self):
  185.         self.workbook.close()
  186. if __name__ == "__main__":
  187.     work = DrawChart("lyshark.xlsx")
  188.     # ------------------------------------------------------------------
  189.     # 统计系统磁盘容量
  190.     disk_val = [
  191.         ["IP地址", "IP地址", "磁盘路径", "总容量", "剩余容量", "利用率"],
  192.         ["/etc/system/", "/proc/", "/sys", "/abc/lyshark"],
  193.         ["1024GG", "2048GB", "111GB", "1111GB"],
  194.         ["1024GG", "2048GB", "111GB", "22GB"],
  195.         ["10%", "50%", "20%", "33%"]
  196.     ]
  197.     ref = work.CreateDiskTable("磁盘分区统计","127.0.0.1",disk_val,3)
  198.     print("下个表格开头位置: {}".format(ref))
  199.     print("[+] 磁盘数据统计完成")
  200.     # -------------------------------------------------------------------
  201.     # 统计系统CPU负载情况
  202.     header = ["主机地址", "CPU内核态", "CPU用户态", "总利用率"]
  203.     cpu_val = [
  204.         ["192.168.1.100", 88, 36, 100],
  205.         ["192.168.1.200", 98, 89, 128],
  206.         ["192.168.1.220", 88, 100, 190]
  207.     ]
  208.     ref = work.CreateCpuUsedTable("CPU利用率",header,cpu_val)
  209.     print("[+] CPU利用率统计已完成")
  210.     # -------------------------------------------------------------------
  211.     # 统计系统内存利用率数据
  212.     header = ["主机地址", "通用内存利用率", "交换内存利用率"]
  213.     mem_val = [
  214.         ["192.168.1.100", 25, 35],
  215.         ["192.168.1.200", 44, 57],
  216.         ["192.168.1.200", 24, 21],
  217.         ["192.168.1.200", 78, 89]
  218.     ]
  219.     ref = work.CreateMemoryTable("内存利用率",header,mem_val)
  220.     print("[+] 内存利用率统计已完成")
  221.     # -------------------------------------------------------------------
  222.     # 获取CPU LoadAvg负载情况
  223.     header = ["拉取日期","1分钟负载","5分钟负载","15分钟负载"]
  224.     cpu_avg_val = [
  225.         ["12:11",0.1,0.2,1.3],
  226.         ["12:12",1.4,3.3,6.9],
  227.         ["12:13",2.6,3.2,6.9]
  228.     ]
  229.     ref = work.CreateCpuLoadAvgTable("127.0.0.1","CPU负载数据统计",header,cpu_avg_val)
  230.     print("[+] CPU负载统计完成")
  231.     work.Save()
复制代码
输出效果如下所示;


来源:https://www.cnblogs.com/LyShark/p/17851542.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具