Python自动化办公

你是否也在被重复繁琐的日常文档处理工作困扰?每天都需要手动处理大量的数据,制作各种汇总表,不仅耗时耗力,还容易出错。本文将介绍如何使用Python自动化办公技术,特别是针对处理汇总明细表并生成指定格式的汇总表的需求,来彻底摆脱这种困境。通过实际案例,我们将展示Python如何通过自动化手段解决这一繁琐工作,提高工作效率。


故事背景

月黑风高夜,打工加班时,在古老的国企大楼里,有一个忙碌的身影,那就是我们的朋友李经理。作为中层领导,他每天都需要处理大量的领料明细数据。不幸的是,公司的ERP系统还停留在“远古时代”,只能导出明细表,却无法自动生成汇总表。这意味着李经理每天都要手动从系统中导出数据,再一个个Excel表格打开,进行繁琐的汇总工作。

每天,他都要面对成百上千的领料记录,每个记录都要仔细核对,然后分类汇总。不仅如此,他还需要从每个记录中提取出日期、时间等信息,计算每个部门的领料次数,最后再将这些数据填入到新的Excel表格中。这样的工作重复、繁琐,让李经理苦不堪言。

明确需求

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

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

针对以上需求,我们决定利用Python的自动化能力,为他编写一个程序,实现一键生成规范汇总表的功能。

Python自动化实现步骤

第一步:提取并处理数据

首先,我们需要从ERP系统中导出的.xls文件中提取数据。由于openpyxl不支持.xls格式,我们选择了xlrd库来读取数据。在读取过程中,我们遇到了时间格式不一致的问题,但通过if语句和xlrd.xldate.xldate_as_datetime函数,我们成功地将所有时间数据转换为了统一的格式。

接下来,我们按照要求提取了需要的字段,并对“领料日期”和“领料时间”进行了拆分。同时,我们排除了“业务类型”为“备注”的数据,以确保汇总表的准确性。

最后,我们计算了每天的领料次数,并将所有数据按照日期进行分类存储,得到了一个包含所有需要信息的字典。

import xlrdimport datetimedef Get_data(file):    wb = xlrd.open_workbook(file) #读取工作簿    ws = wb.sheets()[0] #选第一个工作表    data = {}
    for row in range(7, ws.nrows-2):        dept = ws.cell(2, 16).value #部门        dept_id = ws.cell(3, 16).value #部门编号        dt = ws.cell(row, 0).value #时间        if type(dt) is float:            date_time = xlrd.xldate.xldate_as_datetime(dt, 0)        else:            date_time = datetime.datetime.strptime(dt,'%Y-%m-%d %H:%M:%S')        business = ws.cell(row, 2).value #业务类型        model = ws.cell(row, 3).value #品种        qty = ws.cell(row, 4).value #数量        unit_price = ws.cell(row, 6).value #单价        price = ws.cell(row, 8).value #总价        reward = ws.cell(row, 9).value #额外值        discount = ws.cell(row, 11).value #调整        balance = ws.cell(row, 13).value #剩余        location = str(ws.cell(row, 15).value).strip() #库位        operator = ws.cell(row, 17).value #操作员        date = date_time.date() #日期        time = date_time.time() #时间        info_list=[dept,dept_id,date_time,business,model,qty,unit_price,price,reward,discount,                   balance,location,operator,date,time]        data.setdefault(date,[]) #以日期为键        if info_list[3] != "备注": #不要业务类型为“备注”的数据            data[date].append(info_list)
    #增加当日领取次数            for key in data.keys():        for i in data[key]:            i.append(len(data[key]))
    return data

读取所有的明细数据,进行批量处理

import os #用于获取目标文件所在路径path=os.getcwd()+"\\记录\\" # 文件夹绝对路径files=[]for file in os.listdir(path):    if file.endswith(".xls"): #只获取".xls"后缀的文件        files.append(path+file)

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

import timedef Get_current_time():    time_stamp = time.time()  # 当前时间的时间戳    local_time = time.localtime(time_stamp)  #    str_time = time.strftime('%Y-%m-%d %H.%M.%S', local_time)    return str_time

第二步:新建Excel文件,写入数据,调整格式并保存

在得到所有需要的数据后,我们使用了openpyxl库来创建一个新的Excel文件,并将数据写入其中。我们按照指定的格式设置了单元格的样式,并隐藏了不需要的列。

为了方便管理,我们还按照“领料明细汇总表”加上日期、时间的格式命名了文件,如“领料明细汇总表2024-05-24 10.30.11.xlsx”。

from openpyxl import Workbookfrom openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment #设置单元格格式thin = Side(border_style="thin", color="000000")#定义边框粗细及颜色title = ['部门', '部门编号', '时间', '业务类型', '品种', '数量', '单价', '金额', '额外值',         '调整', '剩余', '库位', '操作员', '领取日期', '领取时间', '领取次数']
wb = Workbook() ws = wb.activews.merge_cells("A1:P1") #合并首行单元格ws.cell(1,1).value = "领料明细汇总表"ws.cell(1,1).font = Font(name=u'黑体',bold=True,size=18)ws.row_dimensions[1].height  = 22.2 #设置首行行高ws.cell(1,1).alignment = Alignment(horizontal="center", vertical="center") #设置对齐ws.append(title) #写入字段行
#写入各部门领料的数据for file in files:    data = Get_data(file)    for key in data.keys():        for i in data[key]:            ws.append(i)
#设置字号,对齐,缩小字体填充,加边框#Font(bold=True)可加粗字体for row_number in range(2, ws.max_row+1):    for col_number in range(1,17):        c = ws.cell(row=row_number,column=col_number)        c.font = Font(size=9)        c.border = Border(top=thin, left=thin, right=thin, bottom=thin)        c.alignment = Alignment(horizontal="left", vertical="center")
#设置列宽        col_name= list("ABCDEFGHIJKLMNOP")col_width = [8, 8, 16, 8, 16, 8, 8, 9.8, 8, 8, 8, 11, 8.3, 9, 8, 8]for i in range(len(col_name)):    ws.column_dimensions[col_name[i]].width = col_width[i]
#分组隐藏列ws.column_dimensions.group('I','K',hidden=True)ws.column_dimensions.group('N','O',hidden=True)
wb.save(f"领料明细汇总表{Get_current_time()}.xlsx")

成果展示

经过我们的努力,李经理现在只需要运行一下我们编写的程序,就可以自动生成规范的汇总表了。这不仅大大节省了他的时间,还提高了数据的准确性。现在,他可以有更多的精力去处理其他重要的事情,而不再被繁琐的汇总工作所困扰

结语

通过这个故事,我们再次看到了Python在自动化办公中的强大能力。只要我们善于利用这些工具,就可以轻松解决很多看似繁琐的问题,提高工作效率。让我们一起拥抱Python,让工作变得更简单、更高效吧!

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/78953.html

(0)
guozi's avatarguozi
上一篇 2024年5月30日 下午2:53
下一篇 2024年5月30日 下午3:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注