服务器之家

服务器之家 > 正文

手把手教你4种方法用Python批量实现多Excel多Sheet合并

时间:2021-02-27 23:02     来源/作者:Python爬虫与数据挖掘

手把手教你4种方法用Python批量实现多Excel多Sheet合并

一、前言

大家好,我是崔艳飞。前两天给大家分享了Python自动化文章:手把手教你利用Python轻松拆分Excel为多个CSV文件,而后在Python进阶交流群里边有读者遇到一个问题,他有很多个Excel表格,他需要对这些Excel文件进行合并。

手把手教你4种方法用Python批量实现多Excel多Sheet合并

诚然,一个一个打开复制粘贴固然可行,但是该方法费时费力,还容易出错,几个文件还可以手动处理,要是几十个甚至上百个,你就抓瞎了,不过这问题对Python来说,so easy,一起来看看吧!

二、项目目标

用Python实现多Excel、多Sheet的合并处理。

三、项目准备

软件:PyCharm

需要的库:pandas, xlrd,os

四、项目分析

1)如何选择要合并的Excel文件?

利用os,获取所有要合并的Excel文件。

2)如何选择要合并的Sheet?

利用xlrd库进行Excel读取,获取要合并的Sheet名。

3)如何合并?

利用pandas库,对所有Sheet名逐一循环打开,通过concat()进行数据追加合并即可。

4)如何保存文件?

利用to_excel保存数据,得到最终合并后的目标文件。

五、项目实现

1、第一步导入需要的库

import pandas as pd 

import xlrd 

import os 

2、第二步选择要合并的Excel文件

#要合并文件路径 

   path="D:/b/" 

   #获取文件夹下所有EXCEL名 

   xlsx_names = [x for x in os.listdir(path) if x.endswith(".xlsx")] 

3、第三步选择要合并的Sheet

# 获取第一个EXCEL名 

 xlsx_names1 = xlsx_names[0] 

 

 aa = path + xlsx_names1 

 #打开第一个EXCEL 

 first_file_fh=xlrd.open_workbook(aa) 

 # 获取SHEET名 

 first_file_sheet=first_file_fh.sheets() 

4、第四步对Sheet内容进行循环合并

#按SHEET名循环 

 for sheet_name in sheet_names: 

     df = None 

     # 按EXCEL名循环 

     for xlsx_name in xlsx_names: 

         sheet_na = pd.ExcelFile(path + xlsx_name).sheet_names 

         if sheet_name in sheet_na: 

             #print(sheet_name) 

             _df = pd.read_excel(path + xlsx_name, sheet_name=sheet_name,header=None) 

             if df is None: 

                 df = _df 

             else

                 df = pd.concat([df, _df], ignore_index=True

         else:continue 

5、第五步保存合并后的文件

  df.to_excel(excel_writer=writer, sheet_name=sheet_name, encoding="utf-8"index=False

    print(sheet_name + "  保存成功!共%d个,第%d个。" % (len(sheet_names),num)) 

    num += 1 

writer.save() 

writer.close() 

六、效果展示

1、处理前Excel数据:

手把手教你4种方法用Python批量实现多Excel多Sheet合并

2、运行进度提示:

手把手教你4种方法用Python批量实现多Excel多Sheet合并

3、合并后的结果:

手把手教你4种方法用Python批量实现多Excel多Sheet合并

七、总结

本文介绍了如何利用Python对多个Excel文件、多Sheet进行合并处理,减少了很多复制粘贴的麻烦,省时省力,还不容易出错,代码不多,循环追加有点绕,想想也就明白了,不懂的随时留言提问,大家一起学习进步。

有想法的小伙伴还可以将文章中的代码进行打包,做成一个exe可执行的小软件,包装好发给别人使用,也可以赚点小费噢,关于打包的教程这里不再赘述,欢迎前往:三个你必须要记住的Pyinstaller打包命令——利用Python实现打包exe。

八、彩蛋

下面两份代码是群内小伙伴提供了,小编也自行测试了下,亲测有效,欢迎大家积极尝试噢!

来自群友Jayson的代码:

# -*- coding: utf-8 -*- 

# @Author: hebe 

# @Date:   2020-04-18 18:31:03 

# @Last Modified by:   hebe 

# @Last Modified time: 2020-04-18 19:40:48 

import os  

import glob 

import openpyxl 

 

def merge_xlsx_files(xlsx_files): 

    wb = openpyxl.load_workbook(xlsx_files[0]) 

    ws = wb.active 

    ws.title = "merged result" 

 

    for  filename in xlsx_files[1:]: 

        workbook = openpyxl.load_workbook(filename) 

        sheet = workbook.active 

        for row in sheet.iter_rows(min_row=1): 

            values = [cell.value for cell in row] 

            ws.append(values

    return wb 

 

#path is very important here , must true

def get_all_xlsx_files(path): 

    xlsx_files = glob.glob(os.path.join(r'C:\\Users\\pdcfi\\Desktop\\', '*.xlsx')) 

    sorted(xlsx_files, key=str.lower

    return xlsx_files 

 

def main(): 

    xlsx_files = get_all_xlsx_files(os.path.expanduser('~lmx')) 

    wb = merge_xlsx_files(xlsx_files) 

    wb.save('merged_form.xlsx'

 

if __name__ == '__main__'

    main() 

     

print("all excel append OK!"

来自好友刘早起的代码:

# -*- coding: utf-8 -*- 

from openpyxl import load_workbook, Workbook 

import glob 

 

path = "C:\\Users\\pdcfi\\Desktop\\excel\\" 

new_workbook = Workbook() 

new_sheet = new_workbook.active 

 

# 用flag变量明确新表是否已经添加了表头,只要添加过一次就无须重复再添加 

flag = 0 

 

for file in glob.glob(path + '/*.xlsx'): 

    workbook = load_workbook(file) 

    sheet = workbook.active 

 

    coloum_A = sheet['A'

    row_lst = [] 

    for cell in coloum_A: 

        if cell: 

            print(cell.row) 

            row_lst.append(cell.row) 

 

    if not flag: 

        header = sheet[1] 

        header_lst = [] 

        for cell in header: 

            header_lst.append(cell.value) 

        new_sheet.append(header_lst) 

        flag = 1 

 

    for row in row_lst: 

        data_lst = [] 

        for cell in sheet[row]: 

            data_lst.append(cell.value) 

        new_sheet.append(data_lst) 

 

new_workbook.save(path + '/' + '符合筛选条件的新表.xlsx'

来自群友Engineer的代码:

import tkinter as tk 

from tkinter import filedialog 

import os 

import pandas as pd 

import glob 

 

root = tk.Tk() 

root.withdraw() 

 

# 选择文件夹位置 

filelocation = os.path.normpath(filedialog.askdirectory(initialdir=os.getcwd())) 

lst = [] 

 

# 读取文件夹下所有文件(xls和xlsx都读取) 

for i in glob.glob(filelocation + "\\\\" + "*.*"): 

    if os.path.splitext(i)[1] in [".xls"".xlsx"]: 

        lst.append(pd.read_excel(i)) 

 

# 保存合并后的excel文件 

writer = pd.ExcelWriter(filedialog.asksaveasfilename(title="保存", initialdir=filelocation, defaultextension="xlsx"

                                                     filetypes=[("Excel 工作簿""*.xlsx"), 

                                                                ("Excel 97-2003 工作簿""*.xls")])) 

pd.concat(lst).to_excel(writer, 'all'index=False

writer.save() 

 

print('\n%d个文件已经合并成功!' % len(lst)) 

当然了,实现本文功能不仅仅限于上面提及的3种方式,使用pandas也是可以做到的,如果你还有其他方法,欢迎交个朋友一起学习交流!

原文地址:https://mp.weixin.qq.com/s/lxj2a1meuZ6mxlC8GKEGWg

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部