如何利用python将excel表格中筛选出来的每一份数据各自另存为新的excel文件?
1.问题描述2.解决过程2.1 问题分析:2.2 解决思路3.运行结果1.问题描述
最近在处理一堆工作上的excel表格中,总是遇到一批重复性的操作问题。为了节约时间,提高效率,尝试用python代码来处理这一类重复性的excel操作问题。
如上图所示:
假如现在有这样一张原始数据表格原始数据.xlsx
,存在大量的数据(这里仅列举部分做演示)。我们需要做的工作是将每一个公司的数据单独筛选出来,然后将筛选出来的每一个公司的数据重新保存为一个新的excel表格。
2.解决过程
2.1 问题分析:
假如数据量很大,按上述过程将存在大量重复性的操作。我们计划使用python来处理这类问题,那么需要考虑如下问题:
首先,寻找python对应的库来操作读取和写入excel文件。第二,对于所有公司,每个公司只取值一次存入列表。第三,定义一个函数,该函数参数为某公司,通过该函数可以获取某公司对应的所有行的数据。第四,将公司列表的每一个值作为参数传入函数,通过循环遍历所有的公司,然后每调用一次函数做一次保存。
2.2 解决思路
第一,经过查阅文档。发现使用openpyxl库可以解决excel文件读写问题。
from openpyxl import load_workbook,Workbook# 这里使用pycharm环境,与.py放入同一路径,因此加载路径省略# load_workbook用于加载表格,Workbook用于创建表格workbook = load_workbook('原始数据.xlsx')sheet = workbook.active
第二,每个公司的名称只取一次存入列表
#先取出所有公司码totalcorp = sheet['B']corp = []for co in totalcorp:corp.append(co.value)#通过一个循环删除重复的公司代码i = 0while i < len(corp):if corp.count(corp[i]) > 1:pos = corp.index(corp[i])temp1 = corp[:pos+1]temp2 = corp[pos+1:]j = 0while j < len(temp2):if temp2[j] == corp[i]:temp2.pop(j)j = j-1j = j+1corp = temp1+temp2i+=1# 删除表头,也就是第一行corp.pop(0)
第三,这里我们先定义一个函数用于获取指定公司的所有行的数据。
def corptoexcel(str1):#参数str1用于传入每一个公司名称#指定公司所在列,即B列,同时创建一个空的列表corploc = sheet['B']row_corp = []for cell in corploc:if cell.value == str1:row_corp.append(cell.row)#创建新的excel文件,打开new_workbook = Workbook()new_sheet = new_workbook.active# 创建和原始数据 一样的表头(第一行)header = sheet[1]header_corp = []for cell in header:header_corp.append(cell.value)new_sheet.append(header_corp)# 从旧表中根据公司名称提取符合条件的行,并遍历所有单元格取值,以列表形式写入新表for row in row_corp:data_corp = []for cell in sheet[row]:data_corp.append(cell.value)new_sheet.append(data_corp)# 最后保存,使用占位符保存为对应公司的名称.xlsxnew_workbook.save('%s.xlsx'%str1)
第四, 将第二步获取的公司列表的每一个值作为参数传入第三部定义的函数,再通过循环遍历每一个公司,每调用一次函数做一次保存。
#遍历每一个公司名称,调用上面的函数。k = 0while k < len(corp):corp1 = corp[k]corptoexcel(corp1)k+=1
3.运行结果
完整的代码如下:
from openpyxl import load_workbook,Workbook# 这里使用pycharm环境,与.py放入同一路径,因此加载路径省略workbook = load_workbook('原始数据.xlsx')sheet = workbook.active# 先取出所有公司码totalcorp = sheet['B']corp = []for co in totalcorp:corp.append(co.value)# 通过一个循环删除重复的公司代码i = 0while i < len(corp):if corp.count(corp[i]) > 1:pos = corp.index(corp[i])temp1 = corp[:pos + 1]temp2 = corp[pos + 1:]j = 0while j < len(temp2):if temp2[j] == corp[i]:temp2.pop(j)j = j - 1j = j + 1corp = temp1 + temp2i += 1# 删除表头,也就是第一行corp.pop(0)def corptoexcel(str1):#参数str1用于传入每一个公司名称#指定公司所在列,即B列,同时创建一个空的列表corploc = sheet['B']row_corp = []for cell in corploc:if cell.value == str1:row_corp.append(cell.row)#创建新的excel文件,打开new_workbook = Workbook()new_sheet = new_workbook.active# 创建和原始数据 一样的表头(第一行)header = sheet[1]header_corp = []for cell in header:header_corp.append(cell.value)new_sheet.append(header_corp)# 从旧表中根据公司名称提取符合条件的行,并遍历所有单元格取值,以列表形式写入新表for row in row_corp:data_corp = []for cell in sheet[row]:data_corp.append(cell.value)new_sheet.append(data_corp)# 最后保存,使用占位符保存为对应公司的名称.xlsxnew_workbook.save('%s.xlsx'%str1)k = 0while k < len(corp):corp1 = corp[k]corptoexcel(corp1)k+=1
如上图所示:
通过运行toexcel.py
,在对应目录下面将自动生成每一个公司的所有行的数据表格。