easy excel date 类型解析报错_Python汇总各单位Excel档领料记录并加总每日领用次数(实例60)...

    系统记录了每个部门的领料情况,现在要求汇总所有部门的领料明细,计算并加总各部门每日领料次数。各部门领料明细如下,需要抓取的数据在红色虚线框里。但是“业务类型”字段中的“备注”数据不需要。

93c94b4dcf18a3636acf2f537863da27.png

    汇总后的数据要求在原表基础上新增5列,数据来源都是原表。其中领取日期、时间需要在原表的“时间”字段中截取。领取次数要求加总,比如2018年1月13日这天领了三次料,则这三次领料记录对应的“领取次数”都填上“3”。“领料明细汇总表”的文件名按“领料明细汇总表”加上日期、时间命名,比如“领料明细汇总表2020-06-24 10.30.11.xlsx”。

07a2f2397c148f3cf655ab824e831035.png

    共分两大步走。第一步,提取并处理好数据。第二步,新建Excel文件,写入数据,调整格式并保存。    先看第一步。观察文件,发现系统导出的都是'.xls'的文件,因此需要用支持该文件库来处理。openpyxl只能歇菜了,这家伙只能搞".xlsx"文件。xlwings和xlrd可以考虑。用xlwings试了试,因为文件是“受保护的视图”,根本无法读取,也靠边站着凉快去了。只有xlrd不负众望,轻松读取。就你了,xlrd。什么?import失败?先运行cmd,输入"pip install xlrd"安装好了再来。

1683803c3cdd01ba6cb1dbd8c286c8bb.png

    如下定义了一个函数Get_data(),其中有一个参数file,即被读取的文件路径。先用xlrd.open_workbook打开工作簿,然后选第一个工作表(工作簿中只有一个工作表),存入ws。建一个字典data用于存数据。然后用for循环遍历领料明细表对应行列,提取数据。    提取到时间这里,出现了问题。原来原表中,有些时间是浮点型,有些是字符串型,一刀切式的处理就出问题了。看来得架两个锅,分别烹饪了。于是上if语句,两种不同类型的分别处理。xlrd从Excel文件单元格中读取的时间数据是浮点型,比如“43460.299733796295”。需要使用xlrd.xldate.xldate_as_datetime(xldate, datemode)将其转换为Python的标准时间格式。其中第一个参数xldate就是那个从Excel文件中读取的浮点型数据,第二个参数datemode有“0”和“1”两个值,指基于1900还是1904,一般我们是基于1900,所以选“0”。转换后的时间如下,对人类很友好。

43460.299733796295,

    而对于字符串格式的,是这样的'2019-12-25 09:04:10',以上函数无法识别,datetime.strptime()善于搞这个。

'2019-12-25 09:04:10',

    依次逐个正常提取数据,按下不表,直到“领料日期”和“领料时间”。这二位不在原表中,需要从上面处理好的date_time中截取,分别使用了date_time.date()和date_time.time()。以上的时间数据就被分割成了datetime.date(2019, 12, 25)和datetime.time(9, 4, 10)。最后将所有数据规规整整,按照顺序存入列表info_list中。然后将日期作为字典data的键的默认值,将相同日期的领料数据作为值存入列表。由于我们不需要“业务类型”为“备注”的数据,所以加了一个if判断语句,将其排除在外。    到此,数据还没完全OK,因为当天的领料次数还未计算。用for循环,遍历字典data,加总每天领料的数据条数,并将其插入到每条数据的最后一个位置。最后返回最终的字典data,至此,一张Excel表中的数据算是搞定了。    可能有小伙伴会问,提取数据的时候为什么不整行取呢?有道理,我也想啊,哪料那破系统导出的数据有很多合并单元格,不连续,整行提取出来还要整理一番,太麻烦。

#读取xls文件中的数据

    然后,将目标Excel文件的路径全部获取,并存到列表files。以便后续使用程序逐个获取。

import os 

    因为汇总后的Excel文件需要用当前日期和时间命名,所以再定义一个函数Get_current_time获取当前时间。调用一下,就获得我们设定格式的日期时间了。

import time

    下面开始第二大步,读取所有目标Excel文件的数据,写入汇总表,并设置相关单元格的格式,隐藏对应的列。openpyxl坐了一会儿冷板凳,现在终于可以出场了,忍不住理了理帅气的头发。    先导入各种相关的库。然后将字段名存入title列表,以便在写入Excel文件的时候使用append()整行写入。然后新建Excel工作簿,取其活动工作表,存入ws变量。将首行的单元格全部合并,标题行中写入字符串“领料明细汇总表”,设定其字体,加粗和字号,行高,对齐方式。然后写入字段行,一个append()就将列表title中的元素逐个取出,每个单元格写入一个,非常强大。    现在来到写入各部门领料数据的部分。这部分处理数据最多,但程序非常少,那就是定义函数的好处。只需调用函数Get_data,然后将每个领料明细表中的数据取出整理好,然后使用append()整行写入即可。    数据写完后,将整个数据部分的单元格格式设置成想要的。然后再设置一下列宽,避免部分字段的数据太长而无法完全显示。这里,我们将列名和列宽的值都存在列表中,然后逐个进行设置,这比单个地设置简洁很多。简洁是Python的特色之一,必须强烈支持。最后分组隐藏设定的列,将当前日期时间加入文件名,保存数据。

#汇总数据到主文件

    上结果图。相当美丽,想说不爱你,铿锵有力的一个字:难39a07b8d4ea737c5f05d543cb4cc6e52.png

63fafd6064a0f873e92405c4928f2939.png

如果您有需要处理的问题,可发邮件到邮箱:donyo@qq.com,一起探讨解决方案。微信公众号输入“源文件”提取所有源文件及资料。

d483e869b0a7492b60f1126e08988510.png

喜欢此文,点亮“在看”!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值