优草派 > Python

Python如何实现excel筛选后生成新表?干货来了一定要收藏!

陈立鑫         优草派

小编最近发现了一个新功能,想给大家分享分享。我们知道,python这门语言可以运用在各大领域中,小编就想如果我使用Excel来结合一下python能做点啥呢。今天我就给大家分享一下python实现从一个excel筛选后生成新表。

Python如何实现excel筛选后生成新表?干货来了一定要收藏!

Python对于Excel表来说,也是非常方便的,我们可以使用python的pandas模块,但是这个最大的问题就是,DataFrame导出的Excel是不具有原表格的格式,那么谁具有这个功能呢,那就是openpyxl模块,不过要命的是,openpyxl读取的单元格的value,如果单元格是经过公式加工的,则读取的就是公式本身,而不是加工后的数据。

不过不去想公式的问题,使用openpyxl模块来实现这个功能还是可以的,代码如下:

#从国家列表中,筛选地区为亚洲的行
from openpyxl import load_workbook
wb=load_workbook('world.xlsx')
for sheet in wb.sheetnames:                  #遍历每一个sheet
  ws=wb[sheet]
  seg='地区'                            #筛选地区为亚洲国家
  cols=next(ws.values)                  #标题行
  index=cols.index(seg)                 #地区字段的序列号
  offset=0                              #每次行被删,行号就会变化,这里是偏差
  dellist=[]                            #存储要删的行的行号列表
  for i in range(2,ws.max_row+1):
    region=ws.cell(row=i,column=index+1).value
    if(region!='亚洲'):
      dellist.append(i)
  for i in dellist:
    ws.delete_rows(i-offset)             #注意openpyxl版本必须在2.5以上否则不能
    offset+=1
wb.save('asia.xlsx')

好像看起来没什么问题,可能你不知道的是出现了一个非常致命的问题,那就是执行效率很差!如果文件不到100K还好,否则执行会非常缓慢。

考虑到公式的问题怎么办呢,我的思路就是二者的结合,先使用Pandas模块,把数据筛选导出成Excel。然后使用openpyxl模块,把原表的单元格式复制到新表,这里面一个难点就是必须搞清楚原表和新表的单元格的映射。

#第一步 利用Dataframe筛选生成Excel 设定原表为oldfile 新表为newfile
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter   #列编号对应的字符
from copy import copy
import pandas as pd
cellmap={}
writer=pd.ExcelWriter(newfile)             
alldata=pd.read_excel(oldfile,None)
for sheet in alldata.keys():                #遍历每一个sheet
     celllmap[sheet]={}
     data=alldata[sheet].fillna('-')
     data=data.loc[data.要筛选的字段=='某数值']
     data.to_excel(writer,sheet,index=False)
     #确认新表和原表的单元格对应关系
     k=1                                                    #新表的单元格行号,从1开始递增    
     rowlist=[1]+list(data.index+2)               #原表的df对应的单元格行号列表
     for rowid in rowlist:
           for col in range(len(data.columns)): #col为每列的列编号    
                letter=get_column_letter(col+1)  #col对应的列字母
                code2=letter+str(k)
                code1=letter+str(rowid)
                cellmap[sheet][code2]=code1
           k=k+1     
writer.save()
#第二步 复制原表的单元格格式到新表
wb1=load_workbook(oldfile)
wb2=load_workbook(newfiie)
for sheet in wb2.sheetnames:
  ws1=wb1[sheet]
  ws2=wb2[sheet]
  ws2.data_validations=copy(ws1.data_validations)   #复制序列等效性
  for cell2 in cellmap[sheet]:
    cell1=cellmap[sheet][cell2]
    ws2[cell2].fill=copy(ws1[cell1].fill)
    ws2[cell2].font=copy(ws1[cell1].font)
    ws2[cell2].number_format=copy(ws1[cell1].number_format)
 
wb2.save(newfile)
  • 微信好友

  • 朋友圈

  • 新浪微博

  • QQ空间

  • 复制链接

取消
5天短视频训练营
新手入门剪辑课程,零基础也能学
分享变现渠道,助你兼职赚钱
限时特惠:0元
立即抢
新手剪辑课程 (精心挑选,简单易学)
第一课
新手如何学剪辑视频? 开始学习
第二课
短视频剪辑培训班速成是真的吗? 开始学习
第三课
不需要付费的视频剪辑软件有哪些? 开始学习
第四课
手机剪辑app哪个好? 开始学习
第五课
如何做短视频剪辑赚钱? 开始学习
第六课
视频剪辑接单网站APP有哪些? 开始学习
第七课
哪里可以学短视频运营? 开始学习
第八课
做短视频运营需要会什么? 开始学习
【原创声明】凡注明“来源:优草派”的文章,系本站原创,任何单位或个人未经本站书面授权不得转载、链接、转贴或以其他方式复制发表。否则,本站将依法追究其法律责任。

客服热线:0731-85127885

湘ICP备19005950号-1  

工商营业执照信息

违法和不良信息举报

举报电话:0731-85127885 举报邮箱:tousu@csai.cn

优草派  版权所有 © 2024