前言:
工作中有遇到很多文件放在一个excel工作簿的情况,想将这些文件拆分出去,一个一个的拆分特别麻烦,想通过python进行拆分,简单的方案是使用pandas的读取每一个sheet,转换成dataframe,然后进行保存到不同的excel中,这样的操作很方便运行也很快,但是不能保留原来文件的格式,今天尝试使用opnpyxl进行拆分。
思路:
首先、需要理清一下拆分的逻辑,只是简单的拆分excel工作簿(将每一个sheet拆分成一个工作簿)还是在拆分sheet的时候拆分sheet中的内容。
1、如果只是简单的拆分excel工作簿,需要知道我们需要拆分那些sheet,那些sheet是公共的。然后根据sheet名称进行拆分即可
from openpyxl import load_workbook
from openpyxl import Workbook
import pandas as pd
wb = load_workbook('文件路径'+r'\{}'.format('文件名称'))
sheet_list = []
for i in wb.sheetnames:
sheet_list.append(i)# 通过循环得到所有的sheet名称
chaifen_sheet_list = sheet_list[n1:n2]#截取需要拆分的sheet名称
for s in range(0,len(chaifen_sheet_list)):
move_sheet = copy.copy(sheet_list)
wb = load_workbook(文件路径+'\{}'.format(文件名称))
sheet=chaifen_sheet_list[s] # 获得当前的sheet名称
if sheet in move_sheet:
move_sheet.remove(sheet)# 将当前的sheet从move_sheet中删除
for move_sheet_name in move_sheet:
if move_sheet_name !='Follow up':
wb.remove(wb[move_sheet_name])# 将除了当前的sheet,其他的都删除
wb.save(r'{}\{}.xlsx'.format(文件保存路径,文件保存名称))
#
理解:首先是打开文件,
然后获得所有的sheet名称,
截取需要拆分的sheet名称并形成一个list(chaifen_sheet_list),
复制一个list,
通过循环的形式拆分:每次循环中首先得到sheet名称,然后从list中剔除,循环方式从wb中删除剩余的sheet,
最后保存文件
2、如果在简单的拆分excel工作簿基础上,还要对sheet中的内容进行拆分。
from openpyxl import load_workbook
from openpyxl import Workbook
import pandas as pd
wb = load_workbook('文件路径'+r'\{}'.format('文件名称'))
sheet_list = []
for i in wb.sheetnames:
sheet_list.append(i)# 通过循环得到所有的sheet名称
chaifen_sheet_list = sheet_list[n1:n2]#截取需要拆分的sheet名称
for s in range(0,len(chaifen_sheet_list)):
move_sheet = copy.copy(sheet_list)
df= pd.read_excel(文件路径+名称,sheet_name=chaifen_sheet_list[s],header=n)
for value in df['columns名称'].unique().tolist():
wb = load_workbook(文件路径+'\{}'.format(文件名称))
sheet=chaifen_sheet_list[s] # 获得当前的sheet名称
if sheet in move_sheet:
move_sheet.remove(sheet)# 将当前的sheet从move_sheet中删除
for move_sheet_name in move_sheet:
if move_sheet_name !='Follow up':
wb.remove(wb[move_sheet_name])# 将除了当前的sheet,其他的都删除
ws = wb[chaifen_sheet_list[s]]
column_to_check = 'A' # 按照A列中的值进行拆分
specific_value = value
for row in range( ws.max_row + 1,1,-1): # 从最后一行开始循环,每次后退1,一直到1一行
cell_value = ws[column_to_check + str(row)].value# 获得A列中对应的行的值
if cell_value != specific_value:# 判断单元的值是否不等于specific_value
ws.delete_rows(row) #删除行
wb.save(r'{}\{}.xlsx'.format(文件保存路径,文件保存名称))
理解:增加了对sheet内容的拆分,此时需要注意拆分的sheet的数据是放一个excel工作簿中还是多个,上述代码是放在不同的工作簿中。
在简单拆分的基础上增加了一不拆分sheet,也增加拆的次数,也就是先拆分工作簿,然后拆分sheet(首先是使用pandas获得拆分的依据,然后循环的方式删除跟依据不一样的值。)最后保存。
如果想放在同一个工作簿中的不同sheet中。
from openpyxl import load_workbook
from openpyxl import Workbook
import pandas as pd
wb = load_workbook('文件路径'+r'\{}'.format('文件名称'))
sheet_list = []
for i in wb.sheetnames:
sheet_list.append(i)# 通过循环得到所有的sheet名称
chaifen_sheet_list = sheet_list[n1:n2]#截取需要拆分的sheet名称
for s in range(0,len(chaifen_sheet_list)):
move_sheet = copy.copy(sheet_list)
df= pd.read_excel(文件路径+名称,sheet_name=chaifen_sheet_list[s],header=n)
wb = load_workbook(文件路径+'\{}'.format(文件名称))
sheet=chaifen_sheet_list[s] # 获得当前的sheet名称
if sheet in move_sheet:
move_sheet.remove(sheet)# 将当前的sheet从move_sheet中删除
for move_sheet_name in move_sheet:
if move_sheet_name !='Follow up':
wb.remove(wb[move_sheet_name])# 将除了当前的sheet,其他的都删除
value_unique =df['columns名称'].unique().tolist()
ws = wb[chaifen_sheet_list[s]]
ws.title = value_unique[0]
column_to_check = 'A'
specific_value = value_unique[0]
for n in range(1,len(value_unique)):
new_worksheet1 = wb.copy_worksheet(ws)
new_worksheet1.title=value_unique[n]
specific_value = value_unique[n]
for row in range( new_worksheet1.max_row + 1,1,-1): # 从最后一行开始循环,每次后退1,一直到1一行
cell_value = new_worksheet1[column_to_check + str(row)].value# 获得A列中对应的行的值
if cell_value != specific_value:# 判断单元的值是否不等于specific_value
new_worksheet1.delete_rows(row) #删除行
for row in range( ws.max_row + 1,1,-1): # 从最后一行开始循环,每次后退1,一直到1一行
cell_value = ws[column_to_check + str(row)].value# 获得A列中对应的行的值
if cell_value != specific_value:# 判断单元的值是否不等于specific_value
ws.delete_rows(row) #删除行
wb.save(r'{}\{}.xlsx'.format(文件保存路径,文件保存名称))
上述代码是经过脱敏处理的,如果有问题,请谅解。有问题请私信。谨慎参考。代码运行之后请核对数据,保证数据的准确性哦!!!!!!!!!!!!