這篇文章主要介紹了python 操作excel表格的方法,幫助大家更好的理解和使用python,感興趣的朋友可以瞭解下
1. 下載相關python包 python操作excel表格可以使用以下三個包 xlrd - 讀excel檔案 xlwt - 寫excel檔案,這個不能修改已有的excel檔案,只能寫新的檔案 xlutils - 修改excel檔案,其實就是透過xlrd複製一份記錄,再進行修改。儲存為老的名字就替換了原檔案,儲存為新的名字就建立一個新檔案
注意事項: a. python讀取excel的日期和時間時 表格內容是2019/5/13,python讀到的值是43606.0,該值為從日期減1899/12/30得到的天數 表格內容是9:00:00,python讀到的值是0.375,該值為時間過了一天的比例,即9/24 表格內容是2019/5/13 9:00:00,python讀到的值是43598.375 日期和時間可以直接相加,因為python讀到的都是轉化為數字之後的值
b. python讀取excel的數字時,如員工編號為181129,最後結果是181129.0,非整數
c. 呼叫save函式儲存新的excel檔案時,字尾名必須是.xls
2. 將python檔案轉為.bat格式 你不可能要求妹子去使用cmd,然後使用python xx.py去執行python檔案,必須想個辦法搞成傻瓜式的。我們可以透過.bat格式檔案實現 新建文字檔案,重新命名為“A考勤小工具.bat”,輸入下面程式碼,@py.exe表示後面的引數是python可執行檔案 @py.exe Akqfx.py
3. 附上相關程式碼和excel格式文字
Akqfx.py
# 該指令碼為修正考勤記錄
# author: yangbao
import os
from datetime import datetime
import xlrd
from xlutils.copy import copy
# 定義檔案是否存在
def get_list_file():
current_list = os.listdir()
must_list = ['原始資料.xls', '外出.xls', '法定假日.xls', '請假.xls']
cj_set = set(must_list) - set(current_list)
if cj_set:
for i in cj_set:
print('{} 不存在,請檢查!'.format(i))
return 0
else:
return 1
# 定義是否存在流程
def get_qjorwc(file_name, person_id, input_time):
book = xlrd.open_workbook(file_name)
book_sheet = book.sheet_by_index(0)
flag = 0
for i in range(1, book_sheet.nrows):
if int(book_sheet.cell_value(i, 1)) == int(person_id):
# 檔案不同,時間處理不同
if file_name == '請假.xls':
cell_begin = book_sheet.cell_value(i, 4)
cell_end = book_sheet.cell_value(i, 5)
else:
cell_begin = book_sheet.cell_value(i, 3) + book_sheet.cell_value(i, 4)
cell_end = book_sheet.cell_value(i, 5) + book_sheet.cell_value(i, 6)
# 判斷原始資料曠工和遲到是否在請假或外出流程裡
# 給額外5min的寬限時間
if cell_begin-5/1440 <= input_time <= cell_end+5/1440:
flag = 1
break
return flag
# 定義是否是法定假日
def get_fdjr(input_time):
book = xlrd.open_workbook('法定假日.xls')
book_sheet = book.sheet_by_index(0)
flag = 0
for i in range(1, book_sheet.nrows):
dt = datetime(*xlrd.xldate_as_tuple(book_sheet.cell_value(i, 0), 0))
if dt.strftime('%Y-%m-%d') == input_time:
flag = 1
break
return flag
def main():
ys_book = xlrd.open_workbook('原始資料.xls')
ys_book_sheet = ys_book.sheet_by_index(0)
new_ys_book = copy(ys_book)
new_ys_book_sheet = new_ys_book.get_sheet(0)
unnormal_list = ['曠工', '遲到']
for i in range(ys_book_sheet.nrows):
# 查上班時間
if ys_book_sheet.cell_value(i, 5) in unnormal_list:
# 查是否是法定假日
dt = ys_book_sheet.cell_value(i, 3)[:10]
if get_fdjr(dt):
new_ys_book_sheet.write(i, 5, '*')
# 查是否有流程
if ys_book_sheet.cell_value(i, 4) != '':
cell_on_time = ys_book_sheet.cell_value(i, 3)[:10] + ' ' + ys_book_sheet.cell_value(i, 4)
cell_on_time_format = datetime.strptime(cell_on_time, "%Y-%m-%d %H:%M:%S") \
- datetime.strptime('1899-12-30', '%Y-%m-%d')
cell_on_time_number = cell_on_time_format.days + cell_on_time_format.seconds / (24 * 3600)
if 12 < cell_on_time_format.seconds / 3600 < 13:
cell_on_time_number = cell_on_time_format.days + 11.5/24
else:
cell_on_time = ys_book_sheet.cell_value(i, 3)[:10]
cell_on_time_format = datetime.strptime(cell_on_time, "%Y-%m-%d") \
- datetime.strptime('1899-12-30', '%Y-%m-%d')
cell_on_time_number = cell_on_time_format.days + cell_on_time_format.seconds / (24 * 3600) + 9/24
qj_on_flag = get_qjorwc('請假.xls', ys_book_sheet.cell_value(i, 1), cell_on_time_number)
wc_on_flag = get_qjorwc('外出.xls', ys_book_sheet.cell_value(i, 1), cell_on_time_number)
if qj_on_flag == 1 or wc_on_flag == 1:
new_ys_book_sheet.write(i, 5, '已有流程')
new_ys_book_sheet.write(i, 11, '')
# 查下班時間
if ys_book_sheet.cell_value(i, 7) in unnormal_list:
# 查是否是法定假日
dt = ys_book_sheet.cell_value(i, 3)[:10]
if get_fdjr(dt):
new_ys_book_sheet.write(i, 7, '*')
new_ys_book_sheet.write(i, 11, '')
# 查是否有流程
if ys_book_sheet.cell_value(i, 6) != '':
cell_out_time = ys_book_sheet.cell_value(i, 3)[:10] + ' ' + ys_book_sheet.cell_value(i, 6)
cell_out_time_format = datetime.strptime(cell_out_time, "%Y-%m-%d %H:%M:%S") \
- datetime.strptime('1899-12-30', '%Y-%m-%d')
cell_out_time_number = cell_out_time_format.days + cell_out_time_format.seconds / (24 * 3600)
if 12 < cell_out_time_format.seconds / 3600 < 13:
cell_out_time_number = cell_out_time_format.days + 13.5/24
else:
cell_out_time = ys_book_sheet.cell_value(i, 3)[:10]
cell_out_time_format = datetime.strptime(cell_out_time, "%Y-%m-%d") \
- datetime.strptime('1899-12-30', '%Y-%m-%d')
cell_out_time_number = cell_out_time_format.days + cell_out_time_format.seconds / (24 * 3600) + 18/24
qj_out_flag = get_qjorwc('請假.xls', ys_book_sheet.cell_value(i, 1), cell_out_time_number)
wc_out_flag = get_qjorwc('外出.xls', ys_book_sheet.cell_value(i, 1), cell_out_time_number)
if qj_out_flag == 1 or wc_out_flag == 1:
new_ys_book_sheet.write(i, 7, '已有流程')
new_ys_book_sheet.write(i, 11, '')
new_excel_name = datetime.now().strftime('%Y%m%d_%H%M%S')+'校正後.xls'
new_ys_book.save(new_excel_name)
if __name__ == '__main__':
if get_list_file():
print('開始考勤分析...')
main()
print('考勤分析結束...')
input('按任意鍵結束')
else:
input('因為缺少相關excel檔案,考勤分析失敗,退出程式,按任意鍵結束')
該文件僅作個人記錄用