excel 练习玩具统计项目组excel日报

import xlrd
import xlwt
import os,time
import json
from xlrd import xldate_as_tuple
from datetime import datetime
from toydir.logutil import logger
logger = logger("root", rootstdout=True, handlerList=['I','E'])
# from matplotlib import font_manager
# my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/simsun.ttc")

class ExcelUnit(object):
     def __init__(self,excel_path):
         self.excelObject=xlrd.open_workbook(excel_path)
         self.sheetObject=self.excelObject.sheet_by_index(0)
         self.sheet_name=self.sheetObject.name
         self.rows=self.sheetObject.nrows
         self.cols=self.sheetObject.ncols

     def getSpecialCell(self,x,y):
         return self.sheetObject.cell(x,y).value

     def read_excel(self):
         list=[]
         for row  in range(1,self.rows):
             lists=self.sheetObject.row_values(row)[:self.cols]

             cell=self.sheetObject.cell_value(row,1)
             try:
                 global d
                 d= datetime(*xldate_as_tuple(cell, 0))
             except Exception as e:
                pass
             cells= d.strftime('%Y/%m/%d')
             lists[1]=cells
             list.append(tuple(lists))
         return list

def getAllExcellContent(Mode):
    """Mode =0 ->week ,Mode=1->month"""
    absxslFileList = []
    xslList=[]
    excelDir=None
    if Mode==0:
        excelDir=os.getcwd()+"\\sourcexsldir"
    elif Mode==1:
        excelDir=os.getcwd()+"\\months_sourcexsl"
    if os.path.isdir(excelDir):
        for o  in os.listdir(excelDir):
            absxslfile=excelDir+'\\'+o
            if o.split('.')[-1]=="xlsx" and os.path.isfile(absxslfile):
                absxslFileList.append(absxslfile)
    for xsl in absxslFileList:
        excelInst=ExcelUnit(xsl)
        xslList.append(excelInst.read_excel())
    return xslList


def Dataset(get_excels):
    error_sum=[]
    news=[]
    contents=[]
    work_attr=["用例编写", "测试准备", "功能用例执行", "其它测试执行", "bug验证", "测试结果整理", "其它", "运维开发"]
    for excel in get_excels:

        for row in excel:
            # print(row)
            if row[0] and row[1] and row[2]and row[3]:
                if row[1].count("/")==2 and row[4] in work_attr:
                    # logger.info(row)
                    contents.append(row)
                else:

                    logger.error("发现异常数据,见异常数据汇总sheet")
                    logger.error("++++++++++++++++++++")
                    logger.error(row)
                    error_sum.append(row)
                    #raise ValueError("DATE FORMAT or Work Nature NOT CORRECT,Check please!")
            else:
                print("======出现格式异常数据==========")
                logger.error(row)
    #order by user
    newdt=sorted(contents, key=lambda x: x[0])
    users_set=list(set([i[0] for i in newdt]))
    #user groupby
    for u in users_set:
        per_list=list(filter(lambda x:x[0]==u,newdt))
        news.extend(per_list)
    new_d=[]
    for r in error_sum:
        j=list(r)
        j[1],j[5]=j[5],j[1]
        k=tuple(j)
        new_d.append(k)
    return news,users_set,new_d

def splitdate(mode):
    datas,users,err=Dataset(getAllExcellContent(Mode=mode))
    all_dts=[]
    for user in users:
       my_list = list(filter(lambda o: o[0]== user, datas))
       # print(my_list)
       my_program=my_list[0][3]
       my_date_list=sorted(list(set([i[1] for i in my_list])))
       for index,day in enumerate(my_date_list):
           lk = []
           work_times = []
           useable_times=[]
           casewriteNumbers = []
           case_excuteNum = []
           bug_submitNum = []
           bug_regNum = []
           for dt in my_list:
               if dt[1]==day:
                   if dt[4]!="其它":
                       useable_time=float(dt[5]) if dt[5] else 0
                       useable_times.append(useable_time)

                   wh=float(dt[5]) if str(dt[5]).strip() else 0
                   cw=int(dt[6]) if str(dt[6]).strip() else 0
                   ce=int(dt[7]) if str(dt[7]).strip() else 0
                   bug_sub=float(dt[8]) if str(dt[8]).strip() else 0
                   bug_reg=float(dt[9]) if str(dt[9]).strip() else 0

                   casewriteNumbers.append(cw)
                   case_excuteNum.append(ce)
                   bug_submitNum.append(int(bug_sub))
                   bug_regNum.append(int(bug_reg))
                   work_times.append(float(wh))
           work_saturation =float('%.3f' % (sum(useable_times)/7))
           lk.insert(0,user)
           lk.insert(1,work_saturation)
           lk.insert(2,day)
           lk.insert(3, my_program)
           lk.insert(4,sum(work_times))
           lk.insert(5,sum(useable_times))

           all_dts.append(tuple(lk))
    # for i in all_dts:
    #     logger.debug(i)
    return all_dts

def week_sum(daily_dt):

    persons=list(set([j[0] for j  in daily_dt ]))
    allperson_week=[]
    for p in persons:
        # my_weekdts = list(filter(lambda o: o[0] == p, daily_dt))
        weekTime=[]
        useable_weekTime=[]
        prog=[]
        man=p
        pg_list = []
        oneperson_oneweek=[]
        for dt in daily_dt:
            oneday_hour=float(dt[4]) if str(dt[4]).strip() else 0
            oneday_usebaletime=float(dt[5]) if str(dt[5]).strip() else 0
            if dt[0]==p:
                weekTime.append(oneday_hour)
                useable_weekTime.append(oneday_usebaletime)
                pg_list.append(dt[3])
        prog.append(pg_list)
        if len(weekTime) ==5:
            week_saturation = float('%.3f' % (sum(useable_weekTime) / 5/7))
        else:
            week_saturation=float('%.3f' %(sum(useable_weekTime)/len(weekTime)/7))
        # for pg in list(set(prog)):
        oneperson_oneweek.insert(0,man)
        oneperson_oneweek.insert(1,week_saturation)
        oneperson_oneweek.insert(2,sum(weekTime))
        allperson_week.append(tuple(oneperson_oneweek))
    orderProgramWeek=sorted(allperson_week,key=lambda x:x[1],reverse=True)
    orderProgramWeek.insert(0,("姓名","周日人均和度","周生产时长"))
    return orderProgramWeek


def sara_bypro():
    #get init data contain ot work
    datas,users,err=Dataset(getAllExcellContent(Mode=0))
    # set program
    pro=list(set([i[3] for i in datas]))
    allpg_list=[]
    for  pg in pro :
        pg_user=[]
        onepro=[]
        useable_list = []
        work_time = []
        for dt in datas:

           if dt[3]==pg:
               pg_user.append(dt[0])
               one_dayhour=float(dt[5]) if dt[5] else 0
               if dt[4]!="其它":
                   useable_time=one_dayhour
                   useable_list.append(useable_time)
               work_time.append(one_dayhour)
        #user set this pro
        real_user=list(set(pg_user))
        # program
        onepro.append(pg)
        #program week sara
        onepro.append(float('%.3f' % (sum(useable_list)/35/len(real_user))))
        # week_pro有效时长
        onepro.append(float('%.3f' % (sum(useable_list))))
        #week pro worktimes
        onepro.append(float('%.3f' % (sum(work_time))))
        #汇总each program week sara
        allpg_list.append(tuple(onepro))
    allpg_list=sorted(allpg_list,key=lambda oneRow:oneRow[1])
    return allpg_list

def create_sheet():
    pro_tbheader=["项目","项目人均人力饱和度","生产时长","工作时长"]
    #err_tbheader=["姓名","工作时长", "工作内容", "所属项目组", "工作性质",  "日期", "用例编写量", "用例执行量", "bug提交量", "bug验证量"]
    headers_summary = ["姓名","工作时长", "工作内容", "所属项目组", "工作性质",  "日期", "用例编写量", "用例执行量", "bug提交量", "bug验证量"]
    xlsx = xlwt.Workbook()
    person_saraday=week_sum(splitdate(0))
    daily_list,user,err=Dataset(getAllExcellContent(Mode=0))
    pro_saralist=sara_bypro()
    pro_saralist.insert(0,tuple(pro_tbheader))
    #add errtb header
    err.insert(0,tuple(headers_summary))
    error_sheet=xlsx.add_sheet("异常数据汇总")
    summaryContainOt=xlsx.add_sheet("日报汇总")
    cur_sheet = xlsx.add_sheet('项目人力投入')
    day_sheet=xlsx.add_sheet("日饱和度")
    pro_sheet=xlsx.add_sheet("项目周饱和度")
    mon_program=xlsx.add_sheet("月项目饱和度")
    mon_day_sheet=xlsx.add_sheet("月度日饱和")
    group_sheet_week=xlsx.add_sheet("自由组合")
    month_init_data=xlsx.add_sheet("月度原始数据")
    #grep_sheet=xlsx.add_sheet("过滤汇总")
    #summaryContainOt=xlsx.add_sheet("日报汇总")
    new_d=[]
    for r in daily_list:
        j=list(r)
        j[1],j[5]=j[5],j[1]
        k=tuple(j)
        new_d.append(k)

    # input summary contain ot
    call_new_d=new_d
    #插入是个动作
    call_new_d.insert(0, tuple(headers_summary))
    for e_index,one_err in enumerate(call_new_d):
            for e_col in range(len(headers_summary)):
              summaryContainOt.write(e_index,e_col,one_err[e_col])
    # action add tb header
    new_s = list(filter(lambda x: x[4] != "其它", new_d))
    # new_s.insert(0,tuple(headers_summary))
    #input data_summary
    for e_index,one_err in enumerate(new_s):
            for e_col in range(len(headers_summary)):
              cur_sheet.write(e_index,e_col,one_err[e_col])
    # input person_sara
    for e_index,one_err in enumerate(person_saraday):
            for e_col in range(3):
              day_sheet.write(e_index,e_col,one_err[e_col])
    # input program_sara
    for e_index,one_err in enumerate(pro_saralist):
            for e_col in range(4):
              pro_sheet.write(e_index,e_col,one_err[e_col])
    # input err sheet
    for e_index,one_err in enumerate(err):
            for e_col in range(len(headers_summary)):
              error_sheet.write(e_index,e_col,one_err[e_col])
    #get month data
    program_month,month_daily=sum_month()
    logger.debug(program_month)
    logger.debug(month_daily)
    reload_mon_pro=[]
    for i in program_month:
            i[1].insert(0,(i[0],'','',''))
            i[1].insert(1,("项目组","月饱和","工时","有效时长"))
            reload_mon_pro.extend(i[1])
    logger.info(reload_mon_pro)
    for index,row in enumerate(reload_mon_pro):
        for col in range(4):
            mon_program.write(index,col,row[col])
    #input month day sheet
    reload_mon_data=[]
    for i in month_daily:
        i[1].insert(0,(i[0],'',''))
        reload_mon_data.extend(i[1])
    for index,row in enumerate(reload_mon_data):
        for col in range(3):
            mon_day_sheet.write(index, col, row[col])
    # input month init data
    for index ,row in enumerate(sum_mutiMonth()):
        for col in range(10):
            month_init_data.write(index,col,row[col])
    #input grep config
    for index,row in enumerate(filter_config_program(Mode=0)):
        for col in range(2):
            group_sheet_week.write(index,col,row[col])
    strf = time.strftime("%Y%m%d_%H_%M", time.localtime())
    xlsx.save(os.getcwd()+"\\result_summarydir\\summary_{}.xls".format(strf))

def sum_month():
    daily_dt=splitdate(mode=1)
    month_list=[str(i)  for i in range(1,13)]
    excel_month=list(set([str(int(it[2].split('/')[1])) for it in daily_dt]))
    intersect_month=list(set(month_list).intersection(set(excel_month)))
    logger.info("交集月份如下:%s" % intersect_month)
    month_data=[(str(m)+"月份日饱和度汇总",list(filter(lambda x:str(int(x[2].split('/')[1]))==m,daily_dt))) for  m  in intersect_month]
    logger.info("all月份汇总: %s" % month_data)
    # for meta in month_data:
    #     print(meta)
    month_daily=[(it[0],reduce_month(it[1])) for it in iter(month_data)]
    program_month=reduce_program_month(intersect_month)
    print(program_month)
    return program_month,month_daily


def reduce_month(daily_dt):
    persons=list(set([j[0] for j  in daily_dt ]))
    allperson_month=[]
    for p in persons:
        monthTime=[]
        useable_monthTime=[]
        prog=[]
        man=p
        pg_list = []
        oneperson_onemonth=[]
        for dt in daily_dt:
            oneday_hour=float(dt[4]) if str(dt[4]).strip() else 0
            oneday_usebaletime=float(dt[5]) if str(dt[5]).strip() else 0
            if dt[0]==p:
                monthTime.append(oneday_hour)
                useable_monthTime.append(oneday_usebaletime)
                pg_list.append(dt[3])
        prog.append(pg_list)
        mon_saturation=float('%.3f' % (sum(useable_monthTime) / len(monthTime)/7))
        oneperson_onemonth.insert(0,man)
        oneperson_onemonth.insert(1,mon_saturation)
        oneperson_onemonth.insert(2,sum(monthTime))
        allperson_month.append(tuple(oneperson_onemonth))
    orderMonths=sorted(allperson_month,key=lambda x:x[1],reverse=True)
    orderMonths.insert(0,("姓名","月人均饱和度","月生产时长"))
    return orderMonths
def  reduce_program_month(intersect_months):
    # get init data contain ot work
    datas, users, err = Dataset(getAllExcellContent(Mode=1))
    Mons_progarm=[]
    for m in intersect_months:
        mondatas=list(filter(lambda x:str(int(x[1].split('/')[1]))==m,datas))
        counter_workdate=list(set([i[1] for i in mondatas]))
        logger.debug("%s月 项目工作日天数: %s" % (m,len(counter_workdate)))
        logger.debug(" %s月过滤数据: %s" %(m,mondatas))
        # set program
        pro = list(set([i[3] for i in mondatas]))
        allpg_list = []
        for pg in pro:
            pg_user = []
            onepro = []
            useable_list = []
            work_time = []
            for dt in datas:
                if dt[3] == pg:
                    pg_user.append(dt[0])
                    one_dayhour = float(dt[5]) if str(dt[5]).strip() else 0
                    if dt[4] != "其它":
                        useable_time = one_dayhour
                        useable_list.append(useable_time)
                    work_time.append(one_dayhour)
            real_user = list(set(pg_user))
            onepro.append(pg)
            onepro.append(float('%.3f' % (sum(useable_list) /len(counter_workdate)/7/ len(real_user))))
            onepro.append(float('%.3f' % (sum(useable_list))))
            onepro.append(float('%.3f' % (sum(work_time))))
            allpg_list.append(tuple(onepro))
        Mon_allpg_list = sorted(allpg_list, key=lambda oneRow: oneRow[1])
        Mons_progarm.append((m+"月项目饱和度",Mon_allpg_list))
    return Mons_progarm


def init_json():

    # if os.path.exists(os.getcwd()+'./config.json'):
    #     pass
    # else:
    #     datas={"磨刀小分队1": ["陈权","王大伟"],"磨刀分队2":["易铭"]}
    #     with open(os.getcwd()+'./config.json','w+',encoding="utf-8")as f:
    #         json.dump(datas,f,ensure_ascii=False,indent=3)
    with open(os.getcwd()+"./config.json",'r+',encoding="utf-8")as e:
        init_data=json.load(e)
    datas=[(k,v) for k,v in init_data.items()]
    return datas
def filter_config_program(Mode):
    if int(Mode)==1:
        data=splitdate(Mode)
    else:
        data=splitdate(0)
    def iter_res():
        summarys=[]
        for gp ,user in init_json():
            get_coinfig_data=list(filter(lambda x:x[0] in user,data))
            # print(get_coinfig_data)
            gp_sara=sum([i[-1] for i in get_coinfig_data])/len(list(set([j[2] for j in get_coinfig_data])))/7/len(user)
            summarys.append((gp,gp_sara))
        return  summarys
    data=iter_res()
    data.insert(0,("组名","组饱和度"))
    return data
def sum_mutiMonth():
    headers=["姓名","日期", "工作内容", "所属项目组", "工作性质",  "工作时长", "用例编写量", "用例执行量", "bug提交量", "bug验证量"]
    data,user,err=Dataset(getAllExcellContent(1))
    data.insert(0,tuple(headers))
    return data

if __name__ == '__main__':

    create_sheet()
    # sum_month()
    # a=filter_config_program(0)
    # print("分组结果:%s" %a)
    # print(sum_mutiMonth())

  

转载于:https://www.cnblogs.com/SunshineKimi/p/11295579.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值