鱼C论坛

 找回密码
 立即注册
查看: 3727|回复: 18

[已解决]用python对excel数据处理 对sheet中数据进行判断,然后写入sheet1相应单元格

[复制链接]
发表于 2019-10-26 15:15:51 | 显示全部楼层 |阅读模式
20鱼币
如题,请大佬使用python帮忙完善代码,已知如下:

表格是一个打卡记录,sheet中3列,每列包含姓名、日期、打卡时间(一天中有4-6次)
sheet1每列包含姓名、日期、上午打卡次数(8-12点),下午打卡次数(14-18点)

希望在sheet中判断打卡时间是上午还是下午,有一次打卡就再sheet1中将姓名、日期相匹配的上午打卡或下午打卡的格子中数字+1

我的原代码写到一半,在判断的时候就不会写了,姑且附上做个参考,如果能帮忙继续写下去并做点注释就最好了!!


>>> import xlrd
>>> import xlwt
>>> from xlutils.copy import copy
>>> kq = xlrd.open_workbook('D:\Program Files\zz\测试1.xlsx')
>>> table = kq.sheet_by_index(0)
>>> all_data = []
>>> for n in range(1,table.nrows):
最佳答案
2019-10-26 15:15:52
本帖最后由 XiaoPaiShen 于 2019-10-28 07:13 编辑

该程序在excel文件中新建一个名字为 ‘kaoqin’ 的表单(sheet)
你给的文件要先把后缀改为xls, 用Excel打开,再另存为xlsx文件。
可能是读写时有损坏,如果文件能用Excel打开,没必要改后缀。

  1. import openpyxl

  2. def judge_time(target):
  3.     # 判断字符串是上午,还是下午
  4.     # 12:00 是下午
  5.     hour, minute = target.split(':', 1)
  6.     if int(hour) < 12:
  7.         return 'am'
  8.     else:
  9.         return 'pm'

  10. def create_tongji(sheet_name, workbook):
  11.     # 创建表单‘kaoqin’
  12.     if sheet_name in workbook.sheetnames:
  13.         del workbook[sheet_name]

  14.     ws_tongji = workbook.create_sheet(title = sheet_name)

  15.     ws_tongji.column_dimensions['A'].width = 20
  16.     ws_tongji.column_dimensions['B'].width = 20
  17.     ws_tongji.column_dimensions['C'].width = 20
  18.     ws_tongji.column_dimensions['D'].width = 20

  19.     ws_tongji['A1'] = '姓名'
  20.     ws_tongji['B1'] = '日期'
  21.     ws_tongji['C1'] = '上午打卡次数'
  22.     ws_tongji['D1'] = '下午打卡次数'

  23.     return ws_tongji

  24. def generate_data(source_name, workbook):
  25.     # 创建字典:
  26.     # key = 姓名|考勤日期
  27.     # value = {'am': 打卡次数, 'pm': 打卡次数}
  28.     ws_source = workbook[source_name]
  29.     kaoqin_dict = dict()
  30.    
  31.     for row in ws_source.iter_rows(min_row=2):
  32.         name_date = row[2].value.strip() + '|' + row[3].value.strip()
  33.         am_pm = judge_time(row[4].value)
  34.         
  35.         if name_date in kaoqin_dict.keys():
  36.             res = kaoqin_dict[name_date]
  37.             if am_pm == 'am':
  38.                 res['am'] += 1
  39.             else:
  40.                 res['pm'] += 1
  41.         else:
  42.             res = {'am':0, 'pm':0}
  43.             if am_pm == 'am':
  44.                 res['am'] += 1
  45.             else:
  46.                 res['pm'] += 1

  47.             kaoqin_dict[name_date] = res

  48.     return kaoqin_dict

  49. def convert_data(data_dict):
  50.     # 将字典转换成列表:
  51.     # [姓名,考勤日期,上午打卡,下午打卡]
  52.     result = []
  53.     for key, value in data_dict.items():
  54.         name, date = key.split('|', 1)
  55.         
  56.         am = '' if value['am'] == 0 else value['am']
  57.         pm = '' if value['pm'] == 0 else value['pm']
  58.         result.append([name, date, am, pm])

  59.     return result
  60.         
  61. def fill_tongji(worksheet, data_list):
  62.     for row in data_list:
  63.         worksheet.append(row)
  64.                
  65. def main():
  66.     file_name = 'test01.xlsx'   
  67.     wb = openpyxl.load_workbook(file_name)   
  68.    
  69.     ws_tongji = create_tongji('kaoqin', wb)
  70.     kq_dict = generate_data('Sheet', wb)
  71.     kq_list = convert_data(kq_dict)
  72.     fill_tongji(ws_tongji, kq_list)

  73.     wb.save(file_name)
  74.    
  75. if __name__ == '__main__' :
  76.     main()
复制代码

最佳答案

查看完整内容

该程序在excel文件中新建一个名字为 ‘kaoqin’ 的表单(sheet) 你给的文件要先把后缀改为xls, 用Excel打开,再另存为xlsx文件。 可能是读写时有损坏,如果文件能用Excel打开,没必要改后缀。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-26 15:15:52 | 显示全部楼层    本楼为最佳答案   
本帖最后由 XiaoPaiShen 于 2019-10-28 07:13 编辑

该程序在excel文件中新建一个名字为 ‘kaoqin’ 的表单(sheet)
你给的文件要先把后缀改为xls, 用Excel打开,再另存为xlsx文件。
可能是读写时有损坏,如果文件能用Excel打开,没必要改后缀。

  1. import openpyxl

  2. def judge_time(target):
  3.     # 判断字符串是上午,还是下午
  4.     # 12:00 是下午
  5.     hour, minute = target.split(':', 1)
  6.     if int(hour) < 12:
  7.         return 'am'
  8.     else:
  9.         return 'pm'

  10. def create_tongji(sheet_name, workbook):
  11.     # 创建表单‘kaoqin’
  12.     if sheet_name in workbook.sheetnames:
  13.         del workbook[sheet_name]

  14.     ws_tongji = workbook.create_sheet(title = sheet_name)

  15.     ws_tongji.column_dimensions['A'].width = 20
  16.     ws_tongji.column_dimensions['B'].width = 20
  17.     ws_tongji.column_dimensions['C'].width = 20
  18.     ws_tongji.column_dimensions['D'].width = 20

  19.     ws_tongji['A1'] = '姓名'
  20.     ws_tongji['B1'] = '日期'
  21.     ws_tongji['C1'] = '上午打卡次数'
  22.     ws_tongji['D1'] = '下午打卡次数'

  23.     return ws_tongji

  24. def generate_data(source_name, workbook):
  25.     # 创建字典:
  26.     # key = 姓名|考勤日期
  27.     # value = {'am': 打卡次数, 'pm': 打卡次数}
  28.     ws_source = workbook[source_name]
  29.     kaoqin_dict = dict()
  30.    
  31.     for row in ws_source.iter_rows(min_row=2):
  32.         name_date = row[2].value.strip() + '|' + row[3].value.strip()
  33.         am_pm = judge_time(row[4].value)
  34.         
  35.         if name_date in kaoqin_dict.keys():
  36.             res = kaoqin_dict[name_date]
  37.             if am_pm == 'am':
  38.                 res['am'] += 1
  39.             else:
  40.                 res['pm'] += 1
  41.         else:
  42.             res = {'am':0, 'pm':0}
  43.             if am_pm == 'am':
  44.                 res['am'] += 1
  45.             else:
  46.                 res['pm'] += 1

  47.             kaoqin_dict[name_date] = res

  48.     return kaoqin_dict

  49. def convert_data(data_dict):
  50.     # 将字典转换成列表:
  51.     # [姓名,考勤日期,上午打卡,下午打卡]
  52.     result = []
  53.     for key, value in data_dict.items():
  54.         name, date = key.split('|', 1)
  55.         
  56.         am = '' if value['am'] == 0 else value['am']
  57.         pm = '' if value['pm'] == 0 else value['pm']
  58.         result.append([name, date, am, pm])

  59.     return result
  60.         
  61. def fill_tongji(worksheet, data_list):
  62.     for row in data_list:
  63.         worksheet.append(row)
  64.                
  65. def main():
  66.     file_name = 'test01.xlsx'   
  67.     wb = openpyxl.load_workbook(file_name)   
  68.    
  69.     ws_tongji = create_tongji('kaoqin', wb)
  70.     kq_dict = generate_data('Sheet', wb)
  71.     kq_list = convert_data(kq_dict)
  72.     fill_tongji(ws_tongji, kq_list)

  73.     wb.save(file_name)
  74.    
  75. if __name__ == '__main__' :
  76.     main()
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
qamj + 5 + 5 + 3 非常感谢为我这么点鱼币写了这么多,剩下一.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-26 17:37:23 | 显示全部楼层
相关资料上传。
你这悬赏似呼也太低了,在热心的人你也得给人家的电费补上。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-26 17:54:39 | 显示全部楼层
ba21 发表于 2019-10-26 17:37
相关资料上传。
你这悬赏似呼也太低了,在热心的人你也得给人家的电费补上。

不知道一般多少悬赏,我后面可以补上咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-26 18:09:13 | 显示全部楼层
qamj 发表于 2019-10-26 17:54
不知道一般多少悬赏,我后面可以补上咯

相关资料上传
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-26 18:10:21 | 显示全部楼层
我认为这起码也是500到1000人家才有激情写这样的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-26 18:17:37 | 显示全部楼层

人在外面,回家上传,总共100币就都补上咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-26 18:39:58 | 显示全部楼层
qamj 发表于 2019-10-26 18:17
人在外面,回家上传,总共100币就都补上咯

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-26 20:06:50 | 显示全部楼层
A
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-27 01:35:42 | 显示全部楼层
需要处理的表格见附件

测试1.rar

8.58 KB, 下载次数: 8

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-27 19:44:05 | 显示全部楼层
qamj 发表于 2019-10-27 01:35
需要处理的表格见附件

表格打不开
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-28 21:41:39 | 显示全部楼层
XiaoPaiShen 发表于 2019-10-28 06:58
该程序在excel文件中新建一个名字为 ‘kaoqin’ 的表单(sheet)
你给的文件要先把后缀改为xls, 用Excel打开 ...

点赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-28 21:47:52 | 显示全部楼层


请给评分,在右下角,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-29 08:40:10 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-29 20:55:39 | 显示全部楼层
XiaoPaiShen 发表于 2019-10-28 06:58
该程序在excel文件中新建一个名字为 ‘kaoqin’ 的表单(sheet)
你给的文件要先把后缀改为xls, 用Excel打开 ...

感谢大佬!不过作为个新手还是有几个问题
1.如何补给你剩余的鱼币呐,虽然剩下不多也就80,再开个帖子邀请回复吗?
2.新手没找到代码怎么读取表格的,所以还没发做测试,所以还是得请教下怎么用哎
3.方便加个好友日后请教么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-29 21:55:55 | 显示全部楼层
qamj 发表于 2019-10-29 20:55
感谢大佬!不过作为个新手还是有几个问题
1.如何补给你剩余的鱼币呐,虽然剩下不多也就80,再开个帖子邀 ...

1. 兄弟不用客气,相互帮助,共同进步。不用再给鱼币了。
2. 在77行,定义了文件名,如果你保存python代码的文件夹和测试文件在同一个目录下,就直接写文件名,不用写路径。否则需要给出路径和文件名。
例如:"D:/Document/Python/Lianxi/test01.xlsx",用‘/’代替反斜杠,可以避免转义符的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-30 00:14:50 | 显示全部楼层
XiaoPaiShen 发表于 2019-10-29 21:55
1. 兄弟不用客气,相互帮助,共同进步。不用再给鱼币了。
2. 在77行,定义了文件名,如果你保存python代 ...

我将py文件放在test01.xlsx同个文件夹下,然后运行,还是提示错误如下,不知道是我哪步操作错了呐

================= RESTART: C:\Users\ThinkPad\Desktop\测试1\测试.py =================
Traceback (most recent call last):
  File "C:\Users\ThinkPad\Desktop\测试1\测试.py", line 88, in <module>
    main()
  File "C:\Users\ThinkPad\Desktop\测试1\测试.py", line 78, in main
    wb = openpyxl.load_workbook(file_name)
  File "C:\Users\ThinkPad\AppData\Local\Programs\Python\Python37\lib\site-packages\openpyxl\reader\excel.py", line 317, in load_workbook
    reader.read()
  File "C:\Users\ThinkPad\AppData\Local\Programs\Python\Python37\lib\site-packages\openpyxl\reader\excel.py", line 275, in read
    self.read_workbook()
  File "C:\Users\ThinkPad\AppData\Local\Programs\Python\Python37\lib\site-packages\openpyxl\reader\excel.py", line 148, in read_workbook
    wb_part = _find_workbook_part(self.package)
  File "C:\Users\ThinkPad\AppData\Local\Programs\Python\Python37\lib\site-packages\openpyxl\reader\excel.py", line 113, in _find_workbook_part
    raise IOError("File contains no valid workbook part")
OSError: File contains no valid workbook part
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-30 01:48:15 | 显示全部楼层
本帖最后由 XiaoPaiShen 于 2019-10-30 03:32 编辑
qamj 发表于 2019-10-30 00:14
我将py文件放在test01.xlsx同个文件夹下,然后运行,还是提示错误如下,不知道是我哪步操作错了呐

=== ...


我测试了你上传的文件,也产生同样的错误。(我无法用Excel直接打开你的测试文件,打开时产生错误)
你用的Excel是什么版本?

请按以下步骤操作:

1. 将文件后缀改为xls
2. 用Excel打开该文件,点击‘Enable Edting’
ex_01.jpg



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-30 02:34:03 | 显示全部楼层
本帖最后由 XiaoPaiShen 于 2019-10-30 02:36 编辑
XiaoPaiShen 发表于 2019-10-30 01:48
我测试了你上传的文件,也产生同样的错误。(我无法用Excel直接打开你的测试文件,打开时产生错误)
...


3. 将文件另存为xlsx格式的Excel文件。
ex_02.jpg

4. 然后再运行python文件
5. 我们操作的是 xlsx 文件。(不是xls文件)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 07:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表