bug统计工具一:xlsxwriter库使用

一、简单的插入文本,图片 等

0. 创建表对象,并命名       
        wb = xlsxwriter.Workbook("**.xlsx")
1. 创建sheet表,并并命名
        sheet =wb.add_worksheet("sheetName")
2. 往某个单元格、或者某几个表格写一个文字,或求和表达式
        sheet.write(0,0,"2021年度")                       #格子;  竖,横 
        sheet.write(7, 2, "=sum(C5:C7)")                 # C5到C7之间求和
        sheet.merge_range(1,0,2,4,"第二季度销售统计")      # 左上格子,右下格子
4. 把列表的元素,依次插入某一行(从某个格子写行)--,常用来写入标题    
        sheet.write_row(3,1,["月份","预期销售额","实际销售额"])  

5. 往格子里写 链接
​​​​​​​        sheet.write_url(9,0,"http://www.baidu.com",string="百度一下") 
6. 往某个格子放图片--图片会超出格子

         sheet.insert_image(11,0,"路径/img.png")

代码思路,就是创建一个 表对象,然后新增内容,最后关闭文件

import xlsxwriter  # 诶哦思writer


"""
0. 创建表对象,并命名
1. 创建sheet表,并并命名
2. 往某个单元格,写文字
3. 合并单元格,写文字  
4. 把列表的元素,依次插入某一行--,常用来写入标题      
5. 往格子里写 链接
6. 往某个格子放图片--图片会超出格子
"""


# 1. 创建工作簿对象
wb =xlsxwriter.Workbook("销售统计表.xlsx")       # --------------0


#  2. 创建工作表对象
sheet =wb.add_worksheet("第二季度")             # --------------1

# 3. 写入数据
sheet.write(0,0,"2021年度")                   # ——————————2.  前两个参数是  格子

sheet.merge_range(1,0,2,4,"第二季度销售统计")   # —————————— 3. 前两个参数是左上格子, 然后是右下角 格子

sheet.write_row(3,0,["月份","预期销售额","实际销售额"]) # -----------4. 前两个参数是列表 的第一个元素要放的

# 表内容
data = [
    ["四月份",400,350],
    ["五月份",500,450],
    ["六月份",600,450]
]

# 计算 (excle公式)
sheet.write(7, 1, "=sum(B5:B7)")        #  --------------1   文字也可以写 excle计算表达式,如           “B5 ————B7 的总和”
sheet.write(7, 2, "=sum(C5:C7)")


for i,items in enumerate(data):     # i表示第几次   emuerate 可以有i
    sheet.write_row(i+4,0,items)

# 写入超链接数据
sheet.write_url(9,0,"http://www.baidu.com",string="百度一下")     # ----------5


# 写入图片
sheet.insert_image(11,0,"img.png")      #  后面是写路径

#4. 关闭文件
wb.close()

文档效果如下: 

二、xlsxwriter控制样式:

设置格子样式

方式1 :以字典的形式 (适合用于初始化做模板等)

format1 = wb.add_format({"bold":True})                  # 设置样式

sheet.write(0,0,"2021年度",format1)                       # 使用样式

format1 = wb.add_format({"bold":True})  
# 整理如下:
    "fg_color": "#808080",  # 单元格的背景颜色,灰色
    "bold": True,              # 字体加粗 也可以写1, 默认为False
    "align": "center",  # 水平对齐方式
    "valign": "vcenter",  # 垂直对齐方式
    "font_color": "white",  # 字体颜色,可以用英语,可以用 色值
    "font_size": 18,  # 字体大小
    "text_wrap": True,  #   为True,在格子内自动换行,  为False,在格子内不换行,  默认不换行,但要超出格子
    "top": 1, "bottom": 1, "left": 1, "right": 1 , # 设置边框
    "italic": True      # 斜体,默认为False

方式2:样式调方法单个加,如下  (使用用来修改样式)

format2 =wb.add_format() 
format2.set_bold()             # 加粗
format2.set_font_color("red")      # 字体颜色
format2.set_font_size(15)  # 设置字体大小
format2.set_font_name("楷体")
format2.set_align("center")    # 设置水平方向居中
format2.set_align("vcenter")   # 设置垂直居中
format2.set_bg_color("gray") # 设置背景颜色

 

使用样式,使用write时,最后一个参数放 样式对象。(如下例子)

merge_range,write_row  同理   最后一个参数,放样式对象​​​​​​​

设置行高,列宽(一个或多个)

# 设置列宽 (多列)
sheet.set_column(1,2,30)

# 设置行高   (一行)
sheet.set_row(3,27)

代码和效果如下 

"""
样式设置
"""

import xlsxwriter


wb =xlsxwriter.Workbook("销售统计表_有样式的.xlsx")
sheet =wb.add_worksheet("第二季度")


#方式1 :以字典的形式
cell_format = wb.add_format({"bold":True})    #  加粗样式



# 方式2:通过  对象调用方法的方式
cell_format2 =wb.add_format()
cell_format2.set_bold()             # 加粗
cell_format2.set_font_color("red")      # 字体颜色
cell_format2.set_font_size(15)  # 设置字体大小
cell_format2.set_font_name("楷体")
cell_format2.set_align("center")    # 设置水平方向居中
cell_format2.set_align("vcenter")   # 设置垂直居中




# 设置header样式(多个格子)
header_format1 =wb.add_format()
header_format1.set_bg_color("gray") # 设置背景颜色
header_format1.set_align("center")
header_format1.set_align("vcenter")


# 设置列宽 (多列)
sheet.set_column(1,2,30)

# 设置行高   (一行)
sheet.set_row(3,27)



sheet.write(0,0,"2021年度",cell_format)   # 写入单个单元格数据,直接使用write ,格式会默认根据后面值是什么调用对应的方法
cell_format.set_font_color("red")           # 有使用第二个方式变红了



sheet.merge_range(1,0,1,2,"第二季度销售统计",cell_format2)  # 合并单元格 ,左上角(行,列)   右下角(行,列)

sheet.write_row(3,0,["月份","预期销售额","实际销售额"],header_format1) # 以行的方式写,适用于表头, 写在  (3,0)位置


# 关闭文件
wb.close()

三、生成图表 -柱状图例子

如下,代码,是柱状图的代码

1. 创建图表对象-

        类型:柱状图

        chart = wb.add_chart({"type":"column"})     # column 柱状图
        chart.set_title({"name":"第二季度销售统计"})    # 设置图标名称

2. 图标对象上指定x,y轴取值,  加x  y 单位

        chart.add_series({
            "name":"",
            "categories":[],
            "values":[]
                })  可以加多个
chart.set_x_axis({"name":"月份"})
chart.set_y_axis({"name":"销售额"})

3.把图表放到sheet对象上

sheet.insert_chart("A12",chart)                # 并指定问题

 代码如下

"""
写入图表到excel
"""

import xlsxwriter


wb =xlsxwriter.Workbook("销售统计表_写图表的.xlsx")
sheet =wb.add_worksheet("第二季度")


#方式1 :以字典的形式
cell_format = wb.add_format({"bold":True})    #  加粗样式


# 方式2:通过  对象调用方法的方式
cell_format2 =wb.add_format() 
cell_format2.set_bold()             # 加粗
cell_format2.set_font_color("red")      # 字体颜色
cell_format2.set_font_size(15)  # 设置字体大小
cell_format2.set_font_name("楷体")
cell_format2.set_align("center")    # 设置水平方向居中
cell_format2.set_align("vcenter")   # 设置垂直居中


# 设置header样式(多个格子)
header_format1 =wb.add_format()
header_format1.set_bg_color("gray") # 设置背景颜色
header_format1.set_align("center")
header_format1.set_align("vcenter")


# 设置列宽
sheet.set_column(1,2,30)

# 设置行高
sheet.set_row(3,27)



sheet.write(0,0,"2021年度",cell_format)   # 写入单个单元格数据,直接使用write ,格式会默认根据后面值是什么调用对应的方法
sheet.merge_range(1,0,1,2,"第二季度销售统计",cell_format2)  # 合并单元格 ,左上角(行,列)   右下角(行,列)

sheet.write_row(3,0,["月份","预期销售额","实际销售额"],header_format1) # 以行的方式写,适用于表头, 写在  (3,0)位置

# 表内容
data = [
    ["四月份",400,350],
    ["五月份",500,450],
    ["六月份",600,450]
]

# 计算 (excle公式)
sheet.write(7, 1, "=sum(B5:B7)")        # 求 B5 ————B7 的总和
sheet.write(7, 2, "=sum(C5:C7)")


for i,items in enumerate(data):     # i表示第几次   emuerate 可以有i
    sheet.write_row(i+4,0,items)




"""
柱状图图表代码如下:
"""
chart = wb.add_chart({"type":"column"})     # column 柱状图
chart.set_title({"name":"第二季度销售统计"})    # 设置图标名称

# 2.添加数据
chart.add_series({
        "name":"预期销售额",    # 图例名称
    # x轴取值范围
    #  "categories":"=第二季度!$A$5:$A$7",       # 第一种方式
    "categories":["第二季度",4,0,6,0],          #  第二种方式

    # Y轴数据的取值范围,
    "values":["第二季度",4,1,6,1]             #第二种方式,工作表名,开始坐标, 结束坐标

     })

chart.add_series({
        "name":"实际销售额",    # 图例名称
    # x轴取值范围
    #
    "categories":["第二季度",4,0,6,0],          #  表示 四月  五月  六月  三个值

    # Y轴数据的取值范围,
    "values":["第二季度",4,2,6,2],           # 表示三个值,分别放到x 轴 3个点上
    "data_labels":{"value":True}        # 柱状图上显示具体的数量
     })


# x轴,y皱描述信息
chart.set_x_axis({"name":"月份"})
chart.set_y_axis({"name":"销售额"})


#  3.插入图表
sheet.insert_chart("A12",chart)


# 关闭文件
wb.close()

最后附上测试报告模板,该模板是根据jira 工具设计

# -*- coding:utf-8 -*-

title_style = {
    "fg_color": "#808080",  # 单元格的背景颜色,灰色
    "bold": 1,  # 字体加粗
    "align": "center",  # 水平对齐方式
    "valign": "vcenter",  # 垂直对齐方式
    "font_color": "white",  # 字体颜色
    "font_size": 18,  # 字体大小
    "text_wrap": 1,  # 自动换行
    "top": 1, "bottom": 1, "left": 1, "right": 1  # 设置边框
}

subtitle_style = {
    "fg_color": "#808080",  # 单元格的背景颜色
    "bold": 1,  # 字体加粗
    "align": "center",  # 水平对齐方式
    "valign": "vcenter",  # 垂直对齐方式
    "font_color": "white",  # 字体颜色
    "font_size": 12,  # 字体大小
    "text_wrap": 1,  # 自动换行
    "top": 1, "bottom": 1, "left": 1, "right": 1  # 设置边框
}

subfunc_style = {
    "fg_color": "white",  # 单元格的背景颜色
    "bold": 1,  # 字体加粗
    "align": "left",  # 水平对齐方式
    "valign": "vcenter",  # 垂直对齐方式
    "font_color": "black",  # 字体颜色
    "font_size": 11,  # 字体大小
    "text_wrap": 1,  # 自动换行
    "top": 1, "bottom": 1, "left": 1, "right": 1  # 设置边框
}

pro_moudle_style = {
    "fg_color": "white",  # 单元格的背景颜色
    "bold": 0,  # 字体加粗
    "align": "left",  # 水平对齐方式
    "valign": "vcenter",  # 垂直对齐方式
    "font_color": "#FFC000",  # 字体颜色
    "font_size": 11,  # 字体大小
    "italic": 1,  # 字体倾斜
    "text_wrap": 1,  # 自动换行
    "top": 1, "bottom": 1, "left": 1, "right": 1  # 设置边框
}

deploy_style = {
    "fg_color": "#C65911",  # 单元格的背景颜色
    "bold": 1,  # 字体加粗
    "align": "center",  # 水平对齐方式
    "valign": "vcenter",  # 垂直对齐方式
    "font_color": "white",  # 字体颜色
    "font_size": 12,  # 字体大小
    "italic": 0,  # 字体倾斜
    "text_wrap": 1,  # 自动换行
    "top": 1, "bottom": 1, "left": 1, "right": 1  # 设置边框
}

wordtemp_style = {
    "fg_color": "white",  # 单元格的背景颜色
    "bold": 0,  # 字体加粗
    "align": "left",  # 水平对齐方式
    "valign": "top",  # 垂直对齐方式
    "font_color": "#FFC000",  # 字体颜色
    "font_size": 11,  # 字体大小
    "italic": 1,  # 字体倾斜
    "text_wrap": 1,  # 自动换行
    "top": 1, "bottom": 1, "left": 1, "right": 1  # 设置边框
}

word_style = {
    "fg_color": "white",  # 单元格的背景颜色
    "bold": 0,  # 字体加粗
    "align": "left",  # 水平对齐方式
    "valign": "vcenter",  # 垂直对齐方式
    "font_color": "black",  # 字体颜色
    "font_size": 11,  # 字体大小
    "italic": 0,  # 字体倾斜
    "text_wrap": 1,  # 自动换行
    "top": 1, "bottom": 1, "left": 1, "right": 1  # 设置边框
}

bug_num_style = {
    "fg_color": "#F8CBAD",  # 单元格的背景颜色
    "bold": 1,  # 字体加粗
    "align": "left",  # 水平对齐方式
    "valign": "vcenter",  # 垂直对齐方式
    "font_color": "black",  # 字体颜色
    "font_size": 11,  # 字体大小
    "italic": 0,  # 字体倾斜
    "text_wrap": 1,
    "top": 1, "bottom": 1, "left": 1, "right": 1  # 设置边框
} 

bug_item_style = {
    "fg_color": "#808080",  # 单元格的背景颜色
    "bold": 1,  # 字体加粗
    "align": "left",  # 水平对齐方式
    "valign": "vcenter",  # 垂直对齐方式
    "font_color": "red",  # 字体颜色
    "font_size": 12,  # 字体大小
    "italic": 0,  # 字体倾斜
    "text_wrap": 1,
    "top": 1, "bottom": 1, "left": 1, "right": 1  # 设置边框
} 

# 行高
Word_Height = 20
Chart_Height = 80
Ver_Chart_Height = 160
# 列宽
Title_Width = 18
Module_Width = 22


class TemplExcel(object):
    """
    docstring for Template
    """
    def __init__(self, workbook):
        self.wb = workbook
        self.row_num = 1

    def set_row_num(self, num):
        self.row_num += num

    def get_cel(self, col_name):
        return col_name + str(self.row_num)


    # sheet1
    # def write_version_temp(self, version, build_num):
    #     # 写版本测试报告模板
    #     ver_report = self.wb.add_worksheet(u'版本测试报告')
    #
    #     # 设置列宽度
    #     ver_report.set_column("A:F", Title_Width)
    #     ver_report.set_column("B:B", Module_Width)
    #     ver_report.set_column("D:D", Module_Width)
    #     ver_report.set_column("F:F", Module_Width)
    #
    #     # 写头 、 设置行高
    #     ver_report.merge_range('A1:F1', version + u'测试报告', self.wb.add_format(title_style))
    #     ver_report.set_row(0, 34)
    #
    #     # 写项目名称列
    #     ver_report.merge_range('A2:A3', u'项目名称', self.wb.add_format(subfunc_style))
    #     ver_report.merge_range('B2:B3', version, self.wb.add_format(word_style))
    #     ver_report.write('C2', U'计划开发周期', self.wb.add_format(subfunc_style))
    #     ver_report.write('D2', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
    #     ver_report.write('C3', U'实际开发周期', self.wb.add_format(subfunc_style))
    #     ver_report.write('D3', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
    #     ver_report.write('E2', U'计划测试周期', self.wb.add_format(subfunc_style))
    #     ver_report.write('F2', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
    #     ver_report.write('E3', U'实际测试周期', self.wb.add_format(subfunc_style))
    #     ver_report.write('F3', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
    #     ver_report.set_row(1, Word_Height)
    #     ver_report.set_row(2, Word_Height)
    #     # 写测试版本列
    #     ver_report.write('A4', U'测试版本', self.wb.add_format(subfunc_style))
    #     ver_report.merge_range('B4:F4', u'代码版本,可SVN版本号,或贴上代码路径加版本号', self.wb.add_format(wordtemp_style))
    #     ver_report.set_row(3, Word_Height)
    #     # 写build列
    #     ver_report.write('A5', U'测试build数', self.wb.add_format(subfunc_style))
    #     ver_report.write('B5', build_num, self.wb.add_format(word_style))
    #     ver_report.write('C5', U'提测打回次数', self.wb.add_format(subfunc_style))
    #     ver_report.write('E5', U'需求变更数', self.wb.add_format(subfunc_style))
    #     ver_report.write('F5', '', self.wb.add_format(word_style))
    #     ver_report.set_row(4, Word_Height)
    #
    #     # 测试环境
    #     ver_report.write('A6', U'测试环境', self.wb.add_format(subfunc_style))
    #     info = "平台:10.1.30.108:20719\r\n数据库:\r\n执行机:WIN10 64位\r\n浏览器:谷歌XXX"
    #     ver_report.merge_range('B6:F6', info, self.wb.add_format(wordtemp_style))
    #     ver_report.set_row(5, Chart_Height)
    #     # 项目相关人员
    #     ver_report.write('A7', U'项目相关人员', self.wb.add_format(subfunc_style))
    #     info = "产品:陈胤兵\r\nUI:朱玲\r\n后端:李君其(负责人)、张双贵\r\n前端:肖涛、陈磊\r\nAPP:罗长章\r\n大数据:杨青\r\n测试:徐盈盈(负责人)、卢育腊、田茂金"
    #     ver_report.merge_range('B7:F7', info, self.wb.add_format(wordtemp_style))
    #     ver_report.set_row(6, Chart_Height)
    #     # 测试记录归档
    #     ver_report.write('A8', U'测试记录归档', self.wb.add_format(subfunc_style))
    #     ver_report.merge_range('B8:F8', u'svn://10.1.30.109/dep/2019年/02-ZVM运维平台/04-V1.3', self.wb.add_format(wordtemp_style))
    #     ver_report.set_row(7, Word_Height)
    #     # 测试方案
    #     ver_report.merge_range('A9:F9', u'测试方案', self.wb.add_format(subtitle_style))
    #     ver_report.set_row(8, Word_Height)
    #     info = "重点验证:\r\n  1、故障运维的流程修改验证   --田茂金\r\n  2、xxx \r\n基本功能验证:\r\n  1、xxx --xxx"
    #     ver_report.merge_range('A10:F10', info, self.wb.add_format(wordtemp_style))
    #     ver_report.set_row(9, Chart_Height)
    #     # 测试结果
    #     ver_report.merge_range('A11:F11', u'测试结果', self.wb.add_format(subtitle_style))
    #     ver_report.set_row(10, Word_Height)
    #     info = "1、故障运维的流程修改验证通过\r\n2、xxx 的基本功能可用,但存在xxx的问题,BUG号:xxx\r\n3、xxx\r\n测试结论:xxx"
    #     ver_report.merge_range('A12:F12', info, self.wb.add_format(wordtemp_style))
    #     ver_report.set_row(11, Chart_Height)
    #     # 遗留问题及解决方案
    #     ver_report.merge_range('A13:F13', u'风险及规避措施', self.wb.add_format(subtitle_style))
    #     ver_report.set_row(12, Word_Height)
    #     info = "1、xxx\r\n  原因:xxx\r\n  解决方案:xxxx\r\n  当前规避方案:xxx"
    #     ver_report.merge_range('A14:F14', info, self.wb.add_format(wordtemp_style))
    #     ver_report.set_row(13, Chart_Height)

    # sheet2
    def write_bug_temp(self, build_bug={'V1.6': 1, 'V1.6.1': 2}, version_bug={'version_bug': 47}, version='test'):
        """
        :param build_bug:    为{} 表示统计的单版本,     {'V1.6': 1, 'V1.6.1': 2}  表示统计的多版本
        :param version_bug:   单版本时会用到这个参数
        :param version:
        :return:
        """

        # 写版本BUG分析模板----表示只有一个版本时
        if not build_bug:
            build_bug = version_bug # bug总数,就是取的 version-bug 参数

        self.row_num = 1
        bug_anal = self.wb.add_worksheet(u'版本BUG分析')
        # 设置列宽度
        bug_anal.set_column("A:E", Title_Width)
        bug_anal.set_column("F:F", 28)
        # 写头、 设置行高
        bug_anal.merge_range('A1:F1', version + u'-BUG统计分析', self.wb.add_format(title_style))
        bug_anal.set_row(0, 34)
        self.set_row_num(1)


        # 写bug总数列
        for build in build_bug:
            num = build_bug[build]
            bug_anal.write(self.get_cel('C'), build, self.wb.add_format(subfunc_style))
            bug_anal.merge_range('%s:%s' % (self.get_cel('D'), self.get_cel('F')), num, self.wb.add_format(word_style))
            bug_anal.set_row(self.row_num - 1, Word_Height)
            self.set_row_num(1)
        if self.row_num > 3:
            bug_anal.merge_range('A2:A%s' % (self.row_num-1), u'bug总数', self.wb.add_format(subfunc_style))
            bug_anal.merge_range('B2:B%s' % (self.row_num-1), list(version_bug.values())[0], self.wb.add_format(word_style))
        else:
            bug_anal.write('A2', u'bug总数', self.wb.add_format(subfunc_style))
            bug_anal.write('B2', list(version_bug.values())[0], self.wb.add_format(word_style))


        # 统计维度
        bug_anal.write(self.get_cel('A'), U'统计维度', self.wb.add_format(subtitle_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), u'分布', self.wb.add_format(subtitle_style))
        bug_anal.write(self.get_cel('F'), U'分析说明', self.wb.add_format(subtitle_style))
        bug_anal.set_row(self.row_num - 1, Word_Height)
        start_pos = self.row_num
        self.set_row_num(1)

        # BUG创建时间分布
        bug_anal.write(self.get_cel('A'), U'BUG创建时间分布', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
        self.set_row_num(1)

        # 轮次间BUG分布
        bug_anal.write(self.get_cel('A'), U'BUG轮次间分布', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
        self.set_row_num(1)

        # 模块分布
        bug_anal.write(self.get_cel('A'), U'BUG模块间分布', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
        self.set_row_num(1)

        # 严重程度分布
        bug_anal.write(self.get_cel('A'), U'BUG严重程度分布', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
        self.set_row_num(1)

        # BUG类型
        bug_anal.write(self.get_cel('A'), U'BUG类型分布', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
        self.set_row_num(1)
        # 人员分布
        bug_anal.write(self.get_cel('A'), U'开发人员有效BUG数', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
        self.set_row_num(1)

        # 人员密度
        bug_anal.write(self.get_cel('A'), U'开发人员DI值', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
        self.set_row_num(1)

        # 测试人员有效bug数
        bug_anal.write(self.get_cel('A'), U'测试人员有效bug数', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
        self.set_row_num(1)

        # reopen分布
        bug_anal.write(self.get_cel('A'), U'开发人员reopen的BUG数', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
        self.set_row_num(1)
        return start_pos

    # sheet3
    def write_bug_log(self, data):
        # 写BUG记录表
        bug_log = self.wb.add_worksheet(u'BUG记录')
        # 设置列宽度
        bug_log.set_column("A:P", 11)
        bug_log.set_column("B:C", 20)
        bug_log.set_column("E:E", 20)
        bug_log.set_column("F:F", 40)
        bug_log.set_column("J:J", 40)
        # 写头
        strat_row = 2
        bug_log.write('A1', u'Bug编号', self.wb.add_format(bug_item_style))
        bug_log.write('B1', u'所属项目', self.wb.add_format(bug_item_style))
        bug_log.write('C1', u'影响版本', self.wb.add_format(bug_item_style))
        bug_log.write('D1', u'报告人', self.wb.add_format(bug_item_style))
        bug_log.write('E1', u'所属模块', self.wb.add_format(bug_item_style))
        bug_log.write('F1', u'Bug标题', self.wb.add_format(bug_item_style))
        bug_log.write('G1', u'严重程度', self.wb.add_format(bug_item_style))
        bug_log.write('H1', u'优先级', self.wb.add_format(bug_item_style))
        bug_log.write('I1', u'Bug类型', self.wb.add_format(bug_item_style))
        bug_log.write('J1', u'BUG描述', self.wb.add_format(bug_item_style))
        bug_log.write('K1', u'Bug状态', self.wb.add_format(bug_item_style))
        bug_log.write('L1', u'激活次数', self.wb.add_format(bug_item_style))
        bug_log.write('M1', u'经办人', self.wb.add_format(bug_item_style))
        bug_log.write('N1', u'解决版本', self.wb.add_format(bug_item_style))
        bug_log.write('O1', u'测试轮次', self.wb.add_format(bug_item_style))
        bug_log.write('P1', u'处理结果', self.wb.add_format(bug_item_style))
        bug_log.write('Q1', u'创建时间', self.wb.add_format(bug_item_style))
        bug_log.set_row(0, Word_Height)
        for j in range(len(data)):
            row = strat_row - 1 + j
            bug_log.set_row(row, Word_Height)
            bug_log.write('A' + str(row+1), data[j]["bug_id"], self.wb.add_format(word_style))
            bug_log.write('B' + str(row+1), data[j]["project"], self.wb.add_format(word_style))
            versions = ""
            for ver in data[j]["versions"]:
                versions += ver + ", "
            bug_log.write('C' + str(row+1), versions[:-2], self.wb.add_format(word_style))
            bug_log.write('D' + str(row+1), data[j]["reporter"], self.wb.add_format(word_style))
            modules = ""
            for module in data[j]["modules"]:
                modules += module + ", "
            bug_log.write('E' + str(row+1), modules[:-2], self.wb.add_format(word_style))
            bug_log.write('F' + str(row+1), data[j]["bug_title"], self.wb.add_format(word_style))
            bug_log.write('G' + str(row+1), data[j]["bug_level"], self.wb.add_format(word_style))
            bug_log.write('H' + str(row+1), data[j]["priority"], self.wb.add_format(word_style))
            bug_log.write('I' + str(row+1), data[j]["bug_type"], self.wb.add_format(word_style))
            bug_log.write('J' + str(row+1), data[j]["description"], self.wb.add_format(word_style))
            bug_log.write('K' + str(row+1), data[j]["status"], self.wb.add_format(word_style))
            bug_log.write('L' + str(row+1), data[j]["reopen"], self.wb.add_format(word_style))
            bug_log.write('M' + str(row+1), data[j]["assignee"], self.wb.add_format(word_style))
            fix_versions = ""
            for ver in data[j]["fix_versions"]:
                fix_versions += ver + ", "
            bug_log.write('N' + str(row+1), fix_versions[:-2], self.wb.add_format(word_style))
            bug_log.write('O' + str(row+1), data[j]["build"], self.wb.add_format(word_style))
            bug_log.write('P' + str(row+1), data[j]["reslut"], self.wb.add_format(word_style))
            bug_log.write('Q' + str(row+1), data[j]["created"], self.wb.add_format(word_style))

    # sheet4
    def write_req_log(self):
        # 写需求变更模板
        req_log = self.wb.add_worksheet(u'需求变更记录')
        # 设置列宽度
        req_log.set_column("A:F", Word_Height)
        req_log.write('A1', u'模块', self.wb.add_format(bug_item_style))
        req_log.write('B1', u'编号', self.wb.add_format(bug_item_style))
        req_log.write('C1', u'原需求描述', self.wb.add_format(bug_item_style))
        req_log.write('D1', u'变更描述', self.wb.add_format(bug_item_style))
        req_log.write('E1', u'影响说明', self.wb.add_format(bug_item_style))
        req_log.write('F1', u'变更时间', self.wb.add_format(bug_item_style))
        req_log.write('G1', u'变更人', self.wb.add_format(bug_item_style))
        req_log.set_row(0, Word_Height)


    # sheet5
    def write_project_temp(self, pro_name=u'ZVM数据运维平台V1.7', ver_num=3):
        # 写项目测试报告模板
        pro_report = self.wb.add_worksheet(u'项目测试报告')
        # 设置列宽度
        pro_report.set_column("A:F", Title_Width)
        pro_report.set_column("B:B", Module_Width)
        pro_report.set_column("D:D", Module_Width)
        pro_report.set_column("F:F", Module_Width)
        # 写头
        pro_report.merge_range('A1:F1', pro_name + u'测试报告', self.wb.add_format(title_style))
        # 设置行高
        pro_report.set_row(0, 34)
        # 写项目名称列
        pro_report.merge_range('A2:A3', u'项目名称', self.wb.add_format(subfunc_style))
        pro_report.merge_range('B2:B3', pro_name, self.wb.add_format(word_style))
        pro_report.write('C2', U'计划开发周期', self.wb.add_format(subfunc_style))
        pro_report.write('D2', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
        pro_report.write('C3', U'实际开发周期', self.wb.add_format(subfunc_style))
        pro_report.write('D3', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
        pro_report.write('E2', U'计划开发周期', self.wb.add_format(subfunc_style))
        pro_report.write('F2', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
        pro_report.write('E3', U'实际开发周期', self.wb.add_format(subfunc_style))
        pro_report.write('F3', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
        pro_report.set_row(1, Word_Height)
        pro_report.set_row(2, Word_Height)
        # 产品经理
        pro_report.write('A4', U'产品经理', self.wb.add_format(subfunc_style))
        pro_report.merge_range('B4:F4', u'xxx', self.wb.add_format(wordtemp_style))
        pro_report.set_row(3, Word_Height)

        # UI设计师
        pro_report.write('A5', U'UI设计师', self.wb.add_format(subfunc_style))
        pro_report.merge_range('B5:F5', u'xxx', self.wb.add_format(wordtemp_style))
        pro_report.set_row(4, Word_Height)
        # 开发人员
        pro_report.write('A6', U'开发人员', self.wb.add_format(subfunc_style))
        pro_report.merge_range('B6:F6', u'李君其(负责人)、xxx', self.wb.add_format(wordtemp_style))
        pro_report.set_row(5, Word_Height)
        # 测试人员
        pro_report.write('A7', U'测试人员', self.wb.add_format(subfunc_style))
        pro_report.merge_range('B7:F7', u'徐盈盈(负责人)、xxx', self.wb.add_format(wordtemp_style))
        pro_report.set_row(6, Word_Height)
        # 测试版本数
        pro_report.write('A8', U'测试版本数', self.wb.add_format(subfunc_style))
        pro_report.write('B8', ver_num, self.wb.add_format(word_style))
        pro_report.write('C8', U'提测打回次数', self.wb.add_format(subfunc_style))
        pro_report.write('E8', U'需求变更数', self.wb.add_format(subfunc_style))
        pro_report.write('F8', '', self.wb.add_format(word_style))
        pro_report.set_row(7, Word_Height)
        # 测试记录归档
        pro_report.write('A9', U'测试记录归档', self.wb.add_format(subfunc_style))
        pro_report.merge_range('B9:F9', u'svn://10.1.30.109/dep/2019年/02-ZVM运维平台/04-V1.3', self.wb.add_format(wordtemp_style))
        pro_report.set_row(8, Word_Height)
        # 测试结果
        pro_report.merge_range('A10:F10', u'模块功能及测试结果', self.wb.add_format(subtitle_style))
        pro_report.set_row(9, Word_Height)
        # 新增&修改模块
        pro_report.merge_range('A11:A14', u'新增&修改模块', self.wb.add_format(subfunc_style))
        pro_report.merge_range('B11:B12', u'故障运维', self.wb.add_format(pro_moudle_style))
        pro_report.merge_range('C11:E11', u'工单列表增加按权限划分的顶部事项统计', self.wb.add_format(wordtemp_style))
        pro_report.merge_range('C12:E12', u'xxx', self.wb.add_format(wordtemp_style))
        pro_report.write('F11', U'通过', self.wb.add_format(subfunc_style))
        pro_report.write('F12', U'通过', self.wb.add_format(subfunc_style))
        pro_report.merge_range('B13:B14', u'xxx', self.wb.add_format(pro_moudle_style))
        pro_report.merge_range('C13:E13', u'xxx', self.wb.add_format(wordtemp_style))
        pro_report.merge_range('C14:E14', u'xxx', self.wb.add_format(wordtemp_style))
        pro_report.write('F13', U'通过', self.wb.add_format(subfunc_style))
        pro_report.write('F14', U'通过', self.wb.add_format(subfunc_style))
        # 回归模块
        pro_report.merge_range('A15:A16', u'回归模块', self.wb.add_format(subfunc_style))
        pro_report.write('B15', U'资产管理', self.wb.add_format(pro_moudle_style))
        pro_report.write('B16', U'xxx', self.wb.add_format(pro_moudle_style))
        pro_report.merge_range('C15:E15', u'基本功能流程验证', self.wb.add_format(wordtemp_style))
        pro_report.merge_range('C16:E16', u'xxx', self.wb.add_format(wordtemp_style))
        pro_report.write('F15', U'通过', self.wb.add_format(subfunc_style))
        pro_report.write('F16', U'通过', self.wb.add_format(subfunc_style))
        # 遗留问题及解决方案
        pro_report.merge_range('A17:F17', u'遗留问题及解决方案', self.wb.add_format(subtitle_style))
        for row in range(10, 16, 1):
            pro_report.set_row(row, Word_Height)
        info = u"1、xxx\r\n  原因:xxx\r\n  解决方案:xxxx\r\n"
        pro_report.merge_range('A18:F18', info, self.wb.add_format(wordtemp_style))
        pro_report.set_row(17, Chart_Height)
        # 风险及规避措施
        pro_report.merge_range('A19:F19', u'风险及规避措施', self.wb.add_format(subtitle_style))
        pro_report.set_row(Title_Width, Word_Height)
        info = u"1、xxx\r\n当前规避方案:xxx"
        pro_report.merge_range('A20:F20', info, self.wb.add_format(wordtemp_style))
        pro_report.set_row(19, Chart_Height)
        # 测试总结及建议
        pro_report.merge_range('A21:F21', u'测试总结及建议', self.wb.add_format(subtitle_style))
        pro_report.set_row(20, Word_Height)
        info = u"1、xxx\r\n2、xxx"
        pro_report.merge_range('A22:F22', info, self.wb.add_format(wordtemp_style))
        pro_report.set_row(21, Chart_Height)
        # 测试总结及建议
        pro_report.merge_range('A23:F23', u'部署注意事项', self.wb.add_format(deploy_style))
        pro_report.set_row(Module_Width, Word_Height)
        info = u"1、xxx\r\n2、xxx"
        pro_report.merge_range('A24:F24', info, self.wb.add_format(wordtemp_style))
        pro_report.set_row(23, Chart_Height)

    # sheet6
    def write_pro_bug_temp(self, pro_name=u'ZVM数据运维平台V1.7', pro_bug=42):
        # 写项目BUG分析模板
        self.row_num = 1
        pro_anal = self.wb.add_worksheet(u'项目BUG分析')
        # 设置列宽度
        pro_anal.set_column("A:E", Title_Width)
        pro_anal.set_column("F:F", 28)
        # 写头
        pro_anal.merge_range('A1:F1', pro_name + u'-项目BUG分析', self.wb.add_format(title_style))
        # 设置行高
        pro_anal.set_row(0, 34)
        # 写bug总数列
        pro_anal.write('A2', u'bug总数', self.wb.add_format(subfunc_style))
        pro_anal.merge_range('B2:F2', pro_bug, self.wb.add_format(word_style))
        pro_anal.set_row(1, Word_Height)
        # 统计维度
        pro_anal.write('A3', U'统计维度', self.wb.add_format(subtitle_style))
        pro_anal.merge_range('B3:E3', u'分布', self.wb.add_format(subtitle_style))
        pro_anal.write('F3', U'分析说明', self.wb.add_format(subtitle_style))
        pro_anal.set_row(2, Word_Height)
        # 版本BUG时间分布
        pro_anal.write('A4', U'BUG创建时间分布', self.wb.add_format(bug_num_style))
        pro_anal.merge_range('B4:E4', '', self.wb.add_format(word_style))
        pro_anal.write('F4', '', self.wb.add_format(word_style))
        pro_anal.set_row(3, Ver_Chart_Height)
        # 各版本BUG分布
        pro_anal.write('A5', U'BUG版本间分布', self.wb.add_format(bug_num_style))
        pro_anal.merge_range('B4:E4', '', self.wb.add_format(word_style))
        pro_anal.write('F5', '', self.wb.add_format(word_style))
        pro_anal.set_row(4, Ver_Chart_Height)
        # 模块分布
        pro_anal.write('A6', U'BUG模块间分布', self.wb.add_format(bug_num_style))
        pro_anal.merge_range('B5:E5', '', self.wb.add_format(word_style))
        pro_anal.write('F6', '', self.wb.add_format(word_style))
        pro_anal.set_row(5, Ver_Chart_Height)

        # 严重程度分布
        pro_anal.write('A7', U'BUG严重程度分布', self.wb.add_format(bug_num_style))
        pro_anal.merge_range('B6:E6', '', self.wb.add_format(word_style))
        pro_anal.write('F7', '', self.wb.add_format(word_style))
        pro_anal.set_row(6, Ver_Chart_Height)
        # BUG类型
        pro_anal.write('A8', U'BUG类型分布', self.wb.add_format(bug_num_style))
        pro_anal.merge_range('B7:E7', '', self.wb.add_format(word_style))
        pro_anal.write('F8', '', self.wb.add_format(word_style))
        pro_anal.set_row(7, Ver_Chart_Height)
        # 人员分布
        pro_anal.write('A9', U'开发人员有效BUG数', self.wb.add_format(bug_num_style))
        pro_anal.merge_range('B8:E8', '', self.wb.add_format(word_style))
        pro_anal.write('F9', '', self.wb.add_format(word_style))
        pro_anal.set_row(8, Ver_Chart_Height)

        # 人员密度
        pro_anal.write('A10', U'开发人员DI值', self.wb.add_format(bug_num_style))
        pro_anal.merge_range('B9:E9', '', self.wb.add_format(word_style))
        pro_anal.write('F10', '', self.wb.add_format(word_style))
        pro_anal.set_row(9, Ver_Chart_Height)

        # 测试人员有效bug数
        pro_anal.write('A11', U'测试人员有效bug数', self.wb.add_format(bug_num_style))
        pro_anal.merge_range('B10:E10', '', self.wb.add_format(word_style))
        pro_anal.write('F11', '', self.wb.add_format(word_style))
        pro_anal.set_row(10, Ver_Chart_Height)

        # reopen分布
        pro_anal.write('A12', U'开发人员reopen的BUG数', self.wb.add_format(bug_num_style))
        pro_anal.merge_range('B11:E11', '', self.wb.add_format(word_style))
        pro_anal.write('F12', '', self.wb.add_format(word_style))
        pro_anal.set_row(11, Ver_Chart_Height)
        # 项目BUG统计位置默认从第4行开始
        self.row_num = 3
        return self.row_num

    # sheet7
    def write_ver_bug_temp(self, pro_name=u'ZVM数据运维平台V1.7', pro_bug=42, version_bug={"ZVM运维平台V1.6": {"version_bug": 46}}):
        # 写项目下版本间BUG分析测试报告模板
        version_num = len(list(version_bug.keys()))
        chart_height = 160
        if version_num > 3:
            chart_height = Ver_Chart_Height + (version_num-3) * Word_Height
        self.row_num = 1
        bug_anal = self.wb.add_worksheet(u'版本间BUG分析')
        # 设置列宽度
        bug_anal.set_column("A:E", Title_Width)
        bug_anal.set_column("F:F", 28)
        # 写头
        bug_anal.merge_range('A1:F1', pro_name + u'-版本间统计分析', self.wb.add_format(title_style))
        self.set_row_num(1)
        # 设置行高
        bug_anal.set_row(0, 34)
        # 写bug总数列
        for ver in version_bug:
            num = version_bug[ver]["version_bug"]
            bug_anal.write(self.get_cel('C'), ver, self.wb.add_format(subfunc_style))
            bug_anal.merge_range('%s:%s' % (self.get_cel('D'), self.get_cel('F')), num, self.wb.add_format(word_style))
            bug_anal.set_row(self.row_num - 1, Word_Height)
            self.set_row_num(1)
        if self.row_num > 3:
            bug_anal.merge_range('A2:A%s' % (self.row_num-1), u'bug总数', self.wb.add_format(subfunc_style))
            bug_anal.merge_range('B2:B%s' % (self.row_num-1), pro_bug, self.wb.add_format(word_style))
        else:
            bug_anal.write('A2', u'bug总数', self.wb.add_format(subfunc_style))
            bug_anal.write('B2', pro_bug, self.wb.add_format(word_style))
        # 统计维度
        bug_anal.write(self.get_cel('A'), U'统计维度', self.wb.add_format(subtitle_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), u'分布', self.wb.add_format(subtitle_style))
        bug_anal.write(self.get_cel('F'), U'分析说明', self.wb.add_format(subtitle_style))
        bug_anal.set_row(self.row_num - 1, Word_Height)
        start_pos = self.row_num
        self.set_row_num(1)
        # 模块分布
        bug_anal.write(self.get_cel('A'), U'BUG模块间分布', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, chart_height)
        self.set_row_num(1)
        # 严重程度分布
        bug_anal.write(self.get_cel('A'), U'BUG严重程度分布', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, chart_height)
        self.set_row_num(1)
        # BUG类型
        bug_anal.write(self.get_cel('A'), U'BUG类型分布', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, chart_height)
        self.set_row_num(1)
        # 人员分布
        bug_anal.write(self.get_cel('A'), U'开发人员有效BUG数', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, chart_height)
        self.set_row_num(1)
        # 人员密度
        bug_anal.write(self.get_cel('A'), U'开发人员DI值', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, chart_height)
        self.set_row_num(1)
        # 测试人员有效bug数
        bug_anal.write(self.get_cel('A'), U'测试人员有效bug数', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, chart_height)
        self.set_row_num(1)
        # reopen分布
        bug_anal.write(self.get_cel('A'), U'开发人员reopen的BUG数', self.wb.add_format(bug_num_style))
        bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
        bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
        bug_anal.set_row(self.row_num - 1, chart_height)
        self.set_row_num(1)
        return start_pos


if __name__ == '__main__':
    import xlsxwriter
    dd = xlsxwriter.Workbook('test0831.xlsx')
    opr = TemplExcel(dd)

    """版本报告 sheet1-----sheet4"""
    # sheet1
    opr.write_version_temp("v1.7",25)

    # sheet2 两种情况
    # opr.write_bug_temp()
    opr.write_bug_temp(build_bug={})


    # sheet3
    data = [{
        "bug_id": "id001", "project": "项目", "versions": ['1.1', '1.2', '1.3'], "reporter": "陶科",
        "modules": ['登录', "首页"],
        "bug_title": "标题", "bug_level": "严重", "priority": "优先级", "bug_type": "代码错误", "description": "小bug",
        "status": "未解决", "reopen": "5", "assignee": "经办人", "fix_versions": ['1.1', '1.2', '1.3'],
        "build": "3", "reslut": "处理了", "created": "1月1日"
    },
        {"bug_id": "id002", "project": "项目2", "versions": ['1.1'], "reporter": "小李", "modules": ['项目中心'],
         "bug_title": "标题", "bug_level": "严重", "priority": "优先级", "bug_type": "代码错误", "description": "小bug",
         "status": "未解决", "reopen": "5", "assignee": "经办人", "fix_versions": ['1.1', '1.2', '1.3'],
         "build": "3", "reslut": "处理了", "created": "1月1日"
         }]
    opr.write_bug_log(data)

    # sheet4
    opr.write_req_log()


    """版本报告 sheet5-----sheet4"""
    opr.write_project_temp()
    opr.write_pro_bug_temp()
    opr.write_ver_bug_temp()

    dd.close()


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值