python:excel統計操作用類封裝

 

# encoding: utf-8
# 版權所有 2023 塗聚文有限公司
# 許可信息查看:
# 描述:
# Author    : geovindu,Geovin Du 塗聚文.
# IDE       : PyCharm 2023.1 python 311
# Datetime  : 2023/9/17 5:40
# User      : geovindu
# Product   : PyCharm
# Project   : LukfookLeaveCalculation
# File      : ExportExcel.py
# explain   : 學習


import openpyxl as openws
import pandas as pd
import numpy as np
import pandasql
import os
import sys
import Common.Utils
import BLL.EmpLoyeeHolidaysGet
import Model.Employee
import Model.HolidayList
import Model.ExcelSheet
from openpyxl import load_workbook

class ExportExcelFile(object):
    """
    輸出處理好的EXCEL文件

    """
    def __init__(self):
        self.sourcefile=""
        self.newfile=""


    def readSheet(self,sourcefile:str):
        """
        讀取EXCEL的工作表名稱
        :param sourcefile:
        :return:
        """
        sheenames = []
        try:
            if os.path.exists(sourcefile):
                dfsheet = pd.ExcelFile(sourcefile)
                if(len(dfsheet.sheet_names)>0):
                    for i in range(0,len(dfsheet.sheet_names)):
                        sheet=Model.ExcelSheet.Sheet()
                        sheet.SheetId=i+1
                        sheet.SheetName=dfsheet.sheet_names[i]
                        sheenames.append(sheet)
        except Exception as ex:
            print(ex)
            pass
        finally:
            print("ok")
            pass

        return sheenames



    def exportFile(self,sourcefile:str,newfile:str):
        """
        文件處理,
        :param sourcefile:源文件
        :param newfile:新文件
        :return:None
        """

        unstr = Common.Utils.Utils()
        thbll = BLL.EmpLoyeeHolidaysGet.EmpLoyeeHolidaysGet()
        try:
            if os.path.exists(sourcefile):  #判斷文件是否存在
                dataframe1 = pd.read_excel(sourcefile)
                datarowcol = dataframe1.shape
                excelRows = datarowcol[0]  #得玻行
                excelColumns = datarowcol[1] #得到列
                titls = dataframe1.columns.to_list()
                year = thbll.getYear(titls[1])
                dmps = []
                # 姓名,工號,序號,部門 0行至3行爲員工資料  第一行爲標題,不算行的內容 可以切片方式GET數據
                # 序號
                idlist = []
                dataId = dataframe1.loc[0:0]
                for idx, datadd in dataId.iterrows():
                    #print("[{}]: {}".format(idx, datadd))
                    idlist = datadd.to_list()
                    for idd in range(1, len(idlist)):
                        # employvee=Model.Employee.employee()
                        # employvee.EmployeeId=idd
                        # dmps.append(employvee)
                        print(idd)
                # 工號
                nolist = []
                dataNo = dataframe1.loc[1:1]
                for idx, dataoo in dataNo.iterrows():
                    #print("[{}]: {}".format(idx, dataoo))
                    nolist = dataoo.to_list()

                #print("*******工號******")
                # 部門
                deplist = []
                dataDep = dataframe1.loc[2:2]
                for idx, datapp in dataDep.iterrows():
                    #print("[{}]: {}".format(idx, datapp))
                    deplist = datapp.to_list()
                #print("*******部門******")

                # 姓名
                namelist = []
                dataName = dataframe1.loc[3:3]
                for idx, datann in dataName.iterrows():
                    #print("[{}]: {}".format(idx, datann))
                    namelist = datann.to_list()

                #print("*******姓名******")

                for i in range(1, len(namelist)):
                    employvee = Model.Employee.employee()
                    employvee.EmployeeId = idlist[i]
                    employvee.EmployeeNo = nolist[i]
                    employvee.EmployeeName = namelist[i]
                    employvee.EmployeeDep = deplist[i]
                    dmps.append(employvee)

                for ob in dmps:
                    print(ob.EmployeeId, ob.EmployeeNo, ob.EmployeeName, ob.EmployeeDep)
                AnnualLeave=0
                Overtime=0
                DeferredHoliday=0
                SpecialLeave=0
                PersonalLeave=0
                SickLeave=0
                ChildcareLeave=0
                LateTime=0
                RegularHoliday=0

                # 內容
                mon=0
                day=0
                getdate=[]
                getHolidays=[]
                readrows=(excelRows-1)-3  #索此值從零開始,所以總數減一,再減三行統計的
                data4 = dataframe1.loc[4:readrows]  #第四行開始內空
                getrow=1
                emplist=[]
                for idx, datavalue in data4.iterrows():
                    #strnum=Common.Utils.Utils.getAnnualLeave(data)

                    employs = Model.Employee.employee()
                    #print("[{}]: {}".format(idx, datavalue))
                    slist=datavalue.tolist()
                    hbll=BLL.EmpLoyeeHolidaysGet.EmpLoyeeHolidaysGet() #病假4小時_x000D_事假0.5小時 未處理


                    #print(slist) #這是讀取第1列的日期數據
                    for i in range(0, 1):
                        strvalue = str(slist[i])
                        #print("get value:", strvalue.replace('nan', ''), type(strvalue))
                        mon=hbll.getMonth(strvalue)
                        day=hbll.getDay(strvalue)
                        #print("*******時間************",mon,day)
                        getdate.append(str(year)+'-'+str(mon)+'-'+str(day))


                    #print(slist)
                    hid=1
                    for i in range(1,len(slist)):

                        getdd = Model.HolidayList.HolidayList()
                        getdd.HolidayDate = str(year) + '-' + str(mon) + '-' + str(day)

                        #strvalue=str(slist[i]).replace(r'\s+|\\n', ' ', regex=True)  _x000D_
                        #isnan=np.isnan(slist[i])
                        #if(isnan):
                        strvalue = str(slist[i]).replace('_x000D_', ' ')  # 規換單元格的換行符,否則處理不了正確數據
                        #strvalue = str(slist[i]).replace('nan', ' ')
                        #print("get value:",strvalue.replace('nan',''),type(strvalue))

                        strnums = hbll.getHolidays(strvalue)  # float str
                        #print("hid:",hid)
                        getdd.HolidayEmpId = hid
                        if(len(strnums)>0):
                            for sn in range(len(strnums)):
                                #print("str:",strnums[sn].HolidayId,strnums[sn].HolidayName,strnums[sn].WorkTime)
                                if strnums[sn].HolidayId==6:
                                    AnnualLeave=AnnualLeave+strnums[sn].WorkTime
                                if strnums[sn].HolidayId == 4:
                                    Overtime=Overtime+strnums[sn].WorkTime
                                if strnums[sn].HolidayId == 3:
                                    DeferredHoliday = DeferredHoliday + strnums[sn].WorkTime
                                if strnums[sn].HolidayId == 2:
                                    SpecialLeave=SpecialLeave+strnums[sn].WorkTime
                                if strnums[sn].HolidayId == 5:
                                    PersonalLeave=PersonalLeave+strnums[sn].WorkTime
                                if strnums[sn].HolidayId == 7:
                                    SickLeave=SickLeave+strnums[sn].WorkTime
                                if strnums[sn].HolidayId == 8:
                                    ChildcareLeave=ChildcareLeave+strnums[sn].WorkTime
                                if strnums[sn].HolidayId == 9:
                                    LateTime=LateTime+strnums[sn].WorkTime
                                if strnums[sn].HolidayId == 1:
                                    RegularHoliday=RegularHoliday+strnums[sn].WorkTime

                            getdd.Holdays = strnums
                        else:
                            #print("0")
                            getdd.Holdays =[]
                        hid+=1
                        getHolidays.append((getdd))
                    employs.EmployeeHolidays=getHolidays
                    employs.EmployeeActiveDate=getdate
                    getrow+=1
                    # getHolidays.append(strnums)
                    #print("類型:", type(datavalue))
                    emplist.append((employs))


                    flist=[]
                    getIdAnnualLeave=[]
                    fdata=('ID','工號','部門','姓名','日期','假期')
                    flist.append(fdata)
                    #print("date:",getdate,len(getdate))
                    #print(len(getHolidays))
                    #for dddd in emplist:
                        #print(dddd.EmployeeId,len(dddd.EmployeeHolidays))  #emplist[0].EmployeeHolidays:
                    for sd in emplist[0].EmployeeHolidays:
                        fdata=(sd.HolidayEmpId,thbll.getEmplee(dmps,sd.HolidayEmpId)[0],thbll.getEmplee(dmps,sd.HolidayEmpId)[1],thbll.getEmplee(dmps,sd.HolidayEmpId)[2],sd.HolidayDate,thbll.getHoliday(sd.Holdays))
                        flist.append(fdata)
                        #ananuaint=thbll.getEmpleeIdAnnualLeave(sd.HolidayEmpId,emplist[0].EmployeeHolidays)
                        #getIdAnnualLeave.append(ananuaint)
                        #print(sd.HolidayEmpId,thbll.getEmplee(dmps,sd.HolidayEmpId)[0],thbll.getEmplee(dmps,sd.HolidayEmpId)[1],thbll.getEmplee(dmps,sd.HolidayEmpId)[2],sd.HolidayDate,thbll.getHoliday(sd.Holdays))
                    #print("**************")
                    #print(getIdAnnualLeave)
                    #print("*************",year,"年",mon,"月","考勤合計*************")#,day,"日"
                    #print("年假合計:",AnnualLeave,"小時,加班合計:",Overtime,"小時,補休合計:",DeferredHoliday,"小時,特假合計:",SpecialLeave,"小時")
                    #print("事假合計",PersonalLeave,"小時,病假合計:",SickLeave,"小時,遲到合計:",LateTime,"分鐘,育兒假合計:",ChildcareLeave,"小時")
                    #print("例休:",RegularHoliday,"天")
                    #print("*****************************************************************")
                    #年假
                    for sd in emplist[0].EmployeeHolidays:
                        ananuaint=[sd.HolidayEmpId,thbll.getHolidayAnnualLeave(sd.Holdays)]
                        getIdAnnualLeave.append(ananuaint)

                    #print(getIdAnnualLeave)
                    dd=thbll.getEmpleeIdAnnualLeave(1,getIdAnnualLeave)
                    #print("年假 id=1 sum:",dd)
                    #加班
                    getIDOvertimm=[]
                    for sd in emplist[0].EmployeeHolidays:
                        overtimeint=[sd.HolidayEmpId,thbll.getHolidayOvertime(sd.Holdays)]
                        getIDOvertimm.append(overtimeint)
                    #print(getIDOvertimm)
                    dov=thbll.getEmpleeIdOvertime(1,getIDOvertimm)
                    #print("加班 id=1 sum:",dov)
                    #補休
                    getIdDeferred=[]
                    for sd in emplist[0].EmployeeHolidays:
                        defint=[sd.HolidayEmpId,thbll.getHolidayDeferred(sd.Holdays)]
                        getIdDeferred.append(defint)
                    #print(getIdDeferred)
                    doef=thbll.getEmpleeIdeferred(1,getIdDeferred)
                    #print("補休 id=1 sum:",doef)

                    #特假 SpecialLeave
                    getIdSpecialLeave=[]
                    for sd in emplist[0].EmployeeHolidays:
                        defint=[sd.HolidayEmpId,thbll.getSpecialLeave(sd.Holdays)]
                        getIdSpecialLeave.append(defint)

                    #事假
                    getIdPersonalLeave=[]
                    for sd in emplist[0].EmployeeHolidays:
                        defint=[sd.HolidayEmpId,thbll.getPersonalLeave(sd.Holdays)]
                        getIdPersonalLeave.append(defint)

                    #病假
                    getIdSickLeave=[]
                    for sd in emplist[0].EmployeeHolidays:
                        defint=[sd.HolidayEmpId,thbll.getSickLeave(sd.Holdays)]
                        getIdSickLeave.append(defint)

                    #遲到
                    getIdLateTime=[]
                    for sd in emplist[0].EmployeeHolidays:
                        defint=[sd.HolidayEmpId,thbll.getLateTime(sd.Holdays)]
                        getIdLateTime.append(defint)



                    #育兒假
                    getIdChildcareLeave=[]
                    for sd in emplist[0].EmployeeHolidays:
                        defint=[sd.HolidayEmpId,thbll.getChildcareLeave(sd.Holdays)]
                        getIdChildcareLeave.append(defint)


                    #例休
                    getIdRegularHoliday=[]
                    for sd in emplist[0].EmployeeHolidays:
                        defint=[sd.HolidayEmpId,thbll.getRegularHoliday(sd.Holdays)]
                        getIdRegularHoliday.append(defint)

                    taum= []
                    tva=("名稱","合計")
                    taum.append(tva)
                    tva=("年假", str(AnnualLeave) + "小時")
                    taum.append(tva)
                    tva=("加班",str(Overtime)+"小時")
                    taum.append(tva)
                    tva=("補休",str(DeferredHoliday)+"小時")
                    taum.append(tva)
                    tva=("特假",str(SpecialLeave)+"小時")
                    taum.append(tva)
                    tva=("事假",str(PersonalLeave)+"小時")
                    taum.append(tva)
                    tva=("病假",str(SickLeave)+"小時")
                    taum.append(tva)
                    tva=("遲到",str(LateTime)+"分鐘")
                    taum.append(tva)
                    tva=("育兒假",str(ChildcareLeave)+"小時")
                    taum.append(tva)
                    tva=("例休",str(RegularHoliday)+"天")
                    taum.append(tva)
                    sheetname1 = str(year) + "年" + str(mon) + "月假期"
                    writer = pd.ExcelWriter(sheetname1+"明細.xlsx")  # 這裏是創建了可寫入不同sheet的文件
                    text1 = pd.DataFrame(flist,columns=['ID','工號','部門','姓名','日期','假期'])
                    text1.to_excel(writer, sheet_name=sheetname1,header=0, index=False)  # sheet命名爲
                    sheetname2=str(year)+"年"+str(mon)+"月合計"
                    text2 = pd.DataFrame(taum) #,columns=['名稱','合計']
                    text2.to_excel(writer, sheet_name=sheetname2, header=0, index=False)  # sheet命名爲
                    text3=dataframe1;
                    sheetname3=str(year) + "年" + str(mon) + "月明細"
                    text3.to_excel(writer,sheet_name=sheetname3, header=0, index=False)
                    #writer.sheets.update()
                    writer.close()


                    dataframe2 = openws.load_workbook(sourcefile)
                    # Define variable to read sheet
                    sheet = dataframe2.active
                    setrow=datarowcol[0] #總共行
                    setcol=datarowcol[1] #總共列
                    #每個人的合計
                    for idd in range(1, len(idlist)):
                        sheet.cell(row=setrow - 1, column=1+idd).value = str(thbll.getEmpleeIdAnnualLeave(idd,getIdAnnualLeave)) + "小時時"
                        sheet.cell(row=setrow - 0, column=1+idd).value = str(thbll.getEmpleeIdOvertime(idd,getIDOvertimm))+"小時"
                        sheet.cell(row=setrow + 1, column=1+idd).value = str(thbll.getEmpleeIdeferred(idd,getIdDeferred))+"小時"

                        sheet.cell(row=setrow + 2, column=1 + idd).value = str(thbll.getEmpleeIdeferred(idd, getIdSpecialLeave)) + "小時"
                        sheet.cell(row=setrow + 3, column=1 + idd).value = str(thbll.getEmpleeIdeferred(idd, getIdPersonalLeave)) + "小時"
                        sheet.cell(row=setrow + 4, column=1 + idd).value = str(thbll.getEmpleeIdeferred(idd, getIdSickLeave)) + "小時"
                        sheet.cell(row=setrow + 5, column=1 + idd).value = str(thbll.getEmpleeIdeferred(idd, getIdLateTime)) + "分鈡"
                        sheet.cell(row=setrow + 6, column=1 + idd).value = str(thbll.getEmpleeIdeferred(idd, getIdChildcareLeave)) + "小時"
                        sheet.cell(row=setrow + 7, column=1 + idd).value = str(thbll.getEmpleeIdeferred(idd, getIdRegularHoliday)) + "天"

                    sheet.cell(row=setrow + 2, column=1).value = "本月特假彙總時數"
                    sheet.cell(row=setrow + 3, column=1).value = "本月事假彙總時數"
                    sheet.cell(row=setrow + 4, column=1).value = "本月病假彙總時數"
                    sheet.cell(row=setrow + 5, column=1).value = "本月遲到彙總分鈡數"
                    sheet.cell(row=setrow + 6, column=1).value = "本月育兒假彙總時數"
                    sheet.cell(row=setrow + 7, column=1).value = "本月例休彙總天數"

                    #合部彙總
                    sheet.cell(row=setrow + 8, column=1).value = "年假彙總"
                    sheet.cell(row=setrow + 9, column=1).value = "加班彙總"
                    sheet.cell(row=setrow + 10, column=1).value = "補休彙總"
                    sheet.cell(row=setrow + 11, column=1).value = "特假彙總"
                    sheet.cell(row=setrow + 12, column=1).value = "事假彙總"
                    sheet.cell(row=setrow + 13, column=1).value = "病假彙總"
                    sheet.cell(row=setrow + 14, column=1).value = "遲到彙總"
                    sheet.cell(row=setrow + 15, column=1).value = "育兒假彙總"
                    sheet.cell(row=setrow + 16, column=1).value = "例休彙總"

                    sheet.cell(row=setrow + 8, column=2).value = str(AnnualLeave) + "小時"
                    sheet.cell(row=setrow + 9, column=2).value = str(Overtime)+"小時"
                    sheet.cell(row=setrow + 10, column=2).value = str(DeferredHoliday)+"小時"
                    sheet.cell(row=setrow + 11, column=2).value = str(SpecialLeave) + "小時"
                    sheet.cell(row=setrow + 12, column=2).value = str(PersonalLeave)+"小時"
                    sheet.cell(row=setrow + 13, column=2).value = str(SickLeave)+"小時"
                    sheet.cell(row=setrow + 14, column=2).value = str(LateTime) + "分鈡"
                    sheet.cell(row=setrow + 15, column=2).value = str(ChildcareLeave)+"小時"
                    sheet.cell(row=setrow + 16, column=2).value = str(RegularHoliday)+"天"

                    dataframe2.save(newfile) #創建新文件
        except Exception as ex:
            print(ex)
            pass

        finally:
            print("文件操作成功!")
            pass

  

調用:

    sourcefile="2023年7月.xlsx"
    newfile="2023年7月new.xlsx"


    export=BLL.ExportExcel.ExportExcelFile()
    sheetnames =export.readSheet(sourcefile)
    for objsheet in sheetnames:
        print(objsheet.SheetName)
    export.exportFile(sourcefile,newfile)

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章