# 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)