Python办公自动化(十九)|批量提取Excel数据

Stella981
• 阅读 728

↑ 关注 + 星标 ,每天学Python新技能
后台回复【大礼包】送你Python自学大礼

Python办公自动化(十九)|批量提取Excel数据

今天我们来讲解一个比较简单的案例,使用openpyxl从Excel中提取指定的数据并生成新的文件,之后进一步批量自动化实现这个功能,通过本例可以学到的知识点:

  • openpyxl模块的运用

  • glob模块建立批处理

数据源:阿里云天池的电商婴儿数据(可自行搜索并下载,如果要完成进阶难度可直接将该数据Excel拷贝999次即可,当然这个拷贝可以交给代码来实现)

需求说明

初级难度:提取电商婴儿数据.xlsx中购买数buy_mount超过50的记录建立新的Excel表

Python办公自动化(十九)|批量提取Excel数据

最后形成如下的表格:

Python办公自动化(十九)|批量提取Excel数据

进阶难度:同一个文件夹下有1000份电商婴儿数据的Excel表格(命名为电商婴儿数据1.xlsx,电商婴儿数据2.xlsx至电商婴儿数据1000.xlsx),需要提取所有表格中购买数buy_mount超过50的记录并汇总至一个新的Excel表

Python实现

让我们先完成初级难度的需求挑战,首先导入所需模块并打开数据表,注意

打开已经存在的Excel用load_workbook,创建新的Excel用Workbook

from openpyxl import load_workbook, Workbook# 数据所在的文件夹目录path = 'C:/Users/xxxxxx'# 打开电商婴儿数据工作簿workbook = load_workbook(path + '/' + '电商婴儿数据.xlsx')# 打开工作表sheet = workbook.active

接下来筛选符合条件的行

buy_mount = sheet['F']row_lst = []for cell in buy_mount:    if isinstance(cell.value, int) and cell.value > 50:        print(cell.row)        row_lst.append(cell.row)

这一步本质上就是对购买数的各个单元格进行判断,如果数值超过50就将其行号放入一个空列表中,间接完成了筛出符合条件的行。注意这一列有可能有的单元格cell的值value不是数值类型,因此需要用isinstance()进行判断,当然也可以将单元格的值先用int()转为整型再判断。

筛选出符合条件的行号就可以提取行并且放入新的Excel中了,因此需要先创建新的工作簿,现在创建新的工作簿写入符合条件的行,思路是根据行号获取到指定行后,遍历所有单元格的值组装成一个列表,用sheet.append()写入新表

new_workbook = Workbook()new_sheet = new_workbook.active# 创建和 电商婴儿数据 一样的表头(第一行)header = sheet[1]header_lst = []for cell in header:    header_lst.append(cell.value)new_sheet.append(header_lst)# 从旧表中根据行号提取符合条件的行,并遍历单元格获取值,以列表形式写入新表for row in row_lst:    data_lst = []    for cell in sheet[row]:        data_lst.append(cell.value)    new_sheet.append(data_lst)# 最后切记保存new_workbook.save(path + '/' + '符合筛选条件的新表.xlsx')

初级难度的需求已经成功完成,至此我们已经学会从单个表中提取需要的行并且放到新的表格里。有的人可能会说了:一个表格的筛选可以直接用Excel中的 筛选 来完成,不需要用代码写这么复杂,还难以理解。因此就有了进阶需求。现在需要完成的工作变成,获取1000个表格中所有符合条件的行并汇总成一个新表。如果是手动操作的行,需要打开每个表格,然后一通筛选操作后,将所有满足条件的行都复制到新表,并且执行上述操作1000次!

这显然不现实,而如果你已经理解初级需求的思路,那么只需要加上几行代码,就可以完成进阶需求。所需要的模块是glob。批处理的大概代码框架如下:

import glob# 1000份数据所在的文件夹目录path = 'C:/Users/xxxxxx'for file in glob.glob(path + '/*'):    pass

如果需要遍历特定类型的文件可以限定后缀,以xlsx后缀的Excel文件为例

for file in glob.glob(path + '/*.xlsx'):    pass

最后只需要将上面写好的针对单个文件的代码放到循环体内部,且load_workbook的路径变成循环出的每一个xlsx文件的绝对路径。当然,还需要想清楚有些代码不能在循环体里重复被执行,如创建新表和给新表添加表头,创建新表放在循环体外就可以,添加表头可以用一个单独的变量来判断这个操作是否已经被执行。完整代码如下:

from openpyxl import load_workbook, Workbookimport globpath = 'C:/Users/xxxxxx'new_workbook = Workbook()new_sheet = new_workbook.active# 用flag变量明确新表是否已经添加了表头,只要添加过一次就无须重复再添加flag = 0for file in glob.glob(path + '/*.xlsx'):    workbook = load_workbook(file)    sheet = workbook.active        buy_mount = sheet['F']    row_lst = []    for cell in buy_mount:        if isinstance(cell.value, int) and cell.value > 50:            print(cell.row)            row_lst.append(cell.row)        if not flag:        header = sheet[1]        header_lst = []        for cell in header:            header_lst.append(cell.value)        new_sheet.append(header_lst)        flag = 1        for row in row_lst:        data_lst = []        for cell in sheet[row]:            data_lst.append(cell.value)        new_sheet.append(data_lst)new_workbook.save(path + '/' + '符合筛选条件的新表.xlsx')

小结

以上就是使用Python实现批量从Excel中提取指定数据的全部过程和代码,如果你也有相关需求,稍作修改即可使用。其实如果你仔细思考会发现这个需求使用pandas会以更简洁的代码实现,但是由于我们之后的Python办公自动化案例中会频繁使用openpyxl,并且在操作Excel时有更多的功能,因此在之后我们将主要讲解如何使用这个openpyxl实现。最后还是希望大家能够理解Python办公自动化的一个核心就是批量操作-解放双手,让复杂的工作自动化!

**********---**--****-------------- End **********---**--****--------------

               推荐阅读
       
              
              
              
     
            
            
            
    
           
           
           
 
        
        
            
           
           
           
     
            
            
            
      
             
             
             
       
              
              
              
        
               
               
               
         
                
                
                 
                  
                   
                    
                     
                                    
                      
                      
                      
                
                       
                       
                       PanDownload复活了!60MB/s!
                
                       
                       
                       B站疯传,堪称最强,一整套编程资料!
                
                       
                       
                       一次登录,终身免费:GitHub宣布向所有人免费开放所有核心功能
               
                      
                      
                      
               
                      
                      
                      
                
                       
                       
                       
                 
                        
                        
                        
                  
                         
                         
                         
                   
                          
                          
                          
                    
                           
                           
                            
                             
                              
                               
                                
                                 
                                  
                                   
                                   推荐我的微信号 
                                   来围观我的朋友圈,我的经验分享,技术更新,不定期送书,坑位有限,速速扫码添加备注:开发方向_昵称_城市,另送你10本Python电子书, 
                                    
                                   
                                  
                                 
                                
                               
                              
                             
                           
                   
                          
                          
                          
                  
                         
                         
                         
                 
                        
                        
                        
                
                       
                       
                       
               
                      
                      
                       
                     
                    
                   
                  
                
        
               
               
               
       
              
              
              
      
             
             
             
     
            
            
            
    
           
           
           
 
        
        
        
  
         
         
             
           
           
           
     
            
            
            
      
             
             
                     
               
               
               
         
                
                
                
        
               
               
               
        
               
               
               
         
                
                
                
        
               
               
               
     
            
            
            
    
           
           
           
 
        
        
        

本文分享自微信公众号 - Python绿色通道(Python_channel)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
2年前
5款Chrome插件,第1款绝对良心!
↑关注星标 ,每天学Python新技能后台回复【大礼包】送你Python自学大礼!(https://oscimg.oschina.net/oscnet/eca3fb6345194ffca6d1d7e9cffa2a05.png)浏览器是工作和生活中接触最多的工具之一,顺手、好用的浏览器能够极
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
可莉 可莉
2年前
10 个“疯狂”的 Python 项目创意
↑ 关注星标 ,每天学Python新技能后台回复【大礼包】送你Python自学大礼!(https://oscimg.oschina.net/oscnet/f55965ed8fec4332b094fc9d6da70e9c.png)剧照| 女王的棋局作者|JuanCruzMa
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这