Python合并或拆分Excel文件——基于openpyxl实现

应用场景:某个文件夹中有多个Excel文件,现在需要将其合成一个Excel文件,一个工作簿中包含多个表单页

openpyxl是经典的处理Excel文件的工具,面临上述需求时,首先想到的就是openpyxl库进行处理,但是,好像openpyxl只支持单个单元格级别的处理,不支持正页表单级别的拷贝,而且不支持较老的.xls文件格式,所以对于.xls类型的文件,需要利用pandas进行处理,当数据量较大时合并速度较慢,比单纯用pandas的方法慢一倍CSDN,在我的笔记本(CPU双核2.70GHz)上,对12个25列1000行的Excel文本文件进行合并时,本篇方法耗时约为12s,而pandas实现的方法CSDN耗时约为6s,话不多说,直接上代码:

#coding: utf-8
import os
import pandas as pd
from openpyxl import Workbook, load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

#将Excel中的sheet中的内容逐单元格拷贝到另一个sheet
#@wso:output sheet, @wst:target sheet
def copy_sheet(wso,wst):
    for i in range(1, wst.max_row+1):
        for j in range(1, wst.max_column+1):
            v=wst.cell(i,j).value#逐单元格赋值
            if v:
                wso.cell(i,j,v)

#将Excel中的sheet中的内容添加到另一个Excel的workbook
#@wb:output workbook, @wst:target sheet
def add_sheet(wb,wst):
    wso=wb.create_sheet(wst.title)#新建sheet页
    copy_sheet(wso,wst)
    
#将Excel中各个sheet中的内容添加到另一个Excel的workbook
#wbo:output workbook, wbt:target workbook
def merge_workbook(wbo,wbt):
    for sh in wbt.sheetnames:#逐sheet页添加
        add_sheet(wbo,wbt[sh])
        
#清除工作表中的空白sheet页
def clear_workbook(wb):
    for sh in wb.sheetnames:#逐sheet页比对:只有1格单元格且单元格内容为空
        if wb[sh].dimensions==r'A1:A1' and wb[sh]['A1'].value==None:
            del wb[sh]
        
#使用openpyxl库和pandas库将指定路径文件夹中的所有Excel(*.xlsx和*.xls)文件合并为一个文件
#由于在openpyxl库中是逐单元格进行的数据赋值,所以速度较慢,数据量较大时尤为明显
def merge_ExcelFiles(dirPath, outputFileName='合并结果.xlsx'):
    dirPath+='\\'
    wbo=Workbook()
    clear_workbook(wbo)#新建立的Excel文件一般都包含若干空的sheet,首先清除默认生成的空sheet
    os.chdir(dirPath)
    file_list=os.listdir(dirPath)
    for file in file_list:
        #如果是*.xlsx文件,则比较简单,直接利用openpyxl来处理
        if file.endswith('.xlsx'):
            wbt=load_workbook(dirPath+file)
            merge_workbook(wbo, wbt)
            print(file)
        #如果是*.xls文件,由于openpyxl不支持,则需要用pandas来对*.xls文件进行读取
        if file.endswith('.xls'):#参数sheet_name默认为0,此时函数返回的直接就是DataFrame类型,但是那样的话只能读取第一个sheet,设置为None可以读取所有的sheet,返回数据则是字典类型
            df=pd.read_excel(dirPath+file, sheet_name=None, dtype='object')#参数dtype默认是None,但为了保护数据(例如身份证号被科学计数法丢失后面几位数字),需要使用object类型
            for key, value in df.items():#但是依然使用openpyxl来保存,因为openpyxl对Excel的支持较好,例如如果sheet的名字相同,则会自动进行“sheet+1”避免重名
                ws=wbo.create_sheet(key)
                for r in dataframe_to_rows(pd.DataFrame(value), index=False, header=True):
                    ws.append(r)
            print(file)
    clear_workbook(wbo)
    print('OK!')
    wbo.save(dirPath+outputFileName)

    
if __name__=="__main__":
    dirPath=r'D:\课程\学生基础信息'
    import time
    time0=time.time()
    merge_ExcelFiles(dirPath,'合并结果.xlsx')
    time1=time.time()
    print("Spending Time:{:.3f}s".format(time1-time0))
    

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pandas是一个强大的数据处理和分析库,它提供了丰富的功能来处理各种数据格式,包括xls文件Excel文件)。通过pandas,你可以轻松地读取、写入和操作Excel文件中的数据。 要使用pandas处理xls文件,你需要先安装pandas库。可以使用以下命令来安装pandas: ``` pip install pandas ``` 安装完成后,你可以使用`pandas.read_excel()`函数来读取xls文件中的数据。这个函数可以接受xls文件的路径作为参数,并返回一个包含数据的DataFrame对象。例如: ```python import pandas as pd data = pd.read_excel('path/to/file.xls') ``` 读取xls文件后,你可以使用DataFrame对象的各种方法和属性来处理和分析数据。例如,你可以使用`data.head()`方法来查看前几行数据,使用`data.shape`属性来获取数据的形状(行数和列数),使用`data.columns`属性来获取列名等等。 如果你想将数据写入到xls文件中,可以使用`DataFrame.to_excel()`方法。这个方法可以接受一个文件路径作为参数,并将DataFrame对象中的数据写入到指定的xls文件中。例如: ```python data.to_excel('path/to/output.xls', index=False) ``` 上述代码将DataFrame对象中的数据写入到指定路径的xls文件中,并且不包含行索引。 总结一下,使用pandas处理xls文件的基本步骤如下: 1. 安装pandas库:`pip install pandas` 2. 导入pandas库:`import pandas as pd` 3. 读取xls文件:`data = pd.read_excel('path/to/file.xls')` 4. 处理和分析数据:使用DataFrame对象的方法和属性进行操作 5. 将数据写入xls文件:`data.to_excel('path/to/output.xls', index=False)`

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值