openpyxl 学习-拆分工作簿:

前言:

工作中有遇到很多文件放在一个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(文件保存路径,文件保存名称))

上述代码是经过脱敏处理的,如果有问题,请谅解。有问题请私信。谨慎参考。代码运行之后请核对数据,保证数据的准确性哦!!!!!!!!!!!!

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值