Back
Featured image of post 使用Python操作Excel

使用Python操作Excel

需求

将微信接龙打卡更新到考勤表中,已到的人✔,未到的人❌

思路拆分

对比两列,一列是人员姓名(固定列),一列是此人当日打卡情况。每次微信打卡后,复制接龙到表格的对比列中,如果固定列的名字有出现在对比列中,则更新当日打卡记录。

1cells = sheet['A3:A11'] #固定列
2cells2 = sheet['N3:N12'] #对比列
3cells3 = sheet['C3:C11'] #保存到新列,每日更新
姓名\日期10月5日10月6日
张三
李四
王五

使用的python包:openpyxsl模块 参考教程:https://blog.csdn.net/weixin_44288604/article/details/120731317

 1import os
 2import openpyxl
 3import chardet
 4import codecs
 5
 6
 7path = r"C:\\Users\\DELL\\Desktop\\work"
 8os.chdir(path)  # 修改工作路径
 9
10workbook = openpyxl.load_workbook('志愿者考勤表.xlsx')	# 返回一个workbook数据类型的值
11# print(workbook.sheetnames)	# 打印Excel表中的所有表
12
13# 选择工作表
14sheet = workbook['Sheet1']  # 获取指定sheet表
15
16cells = sheet['A3:A11'] #固定列
17cells2 = sheet['N3:N12'] #对比列
18cells3 = sheet['C3:C11'] #保存到新列,每日更新
19
20for i in cells:
21    for j in i:
22        # 打印A3到A11的数据
23        # print(j.value)
24        for k in cells2:
25            for l in k:
26                # 打印N3到N12的数据
27                # print(l.value)
28                if(l.value != None):
29                    if(j.value.find(l.value) == -1):
30                        print(l.row)
31                    else:
32                        sheet["C{}".format(j.row)].value = '✔'
33for k in cells3:
34    for l in k:
35        if( sheet["C{}".format(l.row)].value != '✔'):
36            print(l.row)
37            sheet["C{}".format(l.row)].value = '×'
38            
39            
40workbook.save('志愿者考勤表.xlsx') #记得保存,否则更改不生效

需求变更

  • 要求整张表的行列对调
日期\姓名张三李四王五
10月5日
10月6日
 1import os
 2import openpyxl
 3import chardet
 4import codecs
 5
 6
 7path = r"C:\\Users\\DELL\\Desktop\\work\\考勤表"
 8os.chdir(path)  # 修改工作路径
 9
10workbook = openpyxl.load_workbook('志愿者考勤表.xlsx')	# 返回一个workbook数据类型的值
11# print(workbook.sheetnames)	# 打印Excel表中的所有表
12
13# 选择工作表
14sheet = workbook['Sheet1']  # 获取指定sheet表
15alignment = openpyxl.styles.Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=True) # 设置对齐格式
16def columnletter(col):
17    letter = [0, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N']
18    return letter[col]
19
20for i in sheet.iter_rows(min_row=2, max_row=2, min_col=2, max_col=10):
21    for j in i:
22        # 打印固定行(姓名行)
23        # print(j.value)
24        for k in sheet.iter_rows(min_row=16, max_row=16, min_col=1, max_col=10):
25            for l in k:
26                # 打印对比行(excel手动转置)
27                # print(l.value)
28                if(l.value != None):
29                    if(j.value.find(l.value) == -1):
30                        #print(l.column) #注意打印出来的是数字,而不是字母
31                    else:
32                        # -----------------------
33                        #新信息注入新行,打勾     
34                        # -----------------------------
35                        sheet["{}5".format(columnletter(j.column))].value = '✔'
36                        sheet["{}5".format(columnletter(j.column))].alignment = alignment
37# -----------------------------                        
38#新信息注入新行,打叉            
39# -----------------------------            
40for k in sheet.iter_rows(min_row=5, max_row=5, min_col=2, max_col=10):
41    for l in k:
42        if( sheet["{}5".format(columnletter(l.column))].value != '✔'):
43            print(l.column)
44            sheet["{}5".format(columnletter(l.column))].value = '×'
45            sheet["{}5".format(columnletter(l.column))].alignment = alignment            
46            
47workbook.save('志愿者考勤表.xlsx')