Python - 调用接口合并文件夹下多个Excel表

在工作中经常遇到需要打开许多个excel表格,然后合并的需求,合并的同时要求格式必须原汁原味的保留。利用VBA代码可以比较轻松的解决,现在我们来看Python中如何实现。

上代码:

from openpyxl import Workbook
from win32com.client import Dispatch
import os
import datetime


def copy_excel_file(source_file_list, destination_file):
    run_app = Dispatch('Excel.Application')
    run_app.Visible = False  # 改为True可以看到excel的打开窗口

    for file in source_file_list:
        source_workbook = run_app.Workbooks.Open(Filename=file)
        destination_workbook = run_app.Workbooks.Open(Filename=destination_file)

        source_workbook.Worksheets(1).Copy(Before=destination_workbook.Worksheets(1))
        destination_workbook.Close(SaveChanges=True)

    run_app.Quit()


class ParameterGenerator:

    def __init__(self):
        # self.directory_path = directory_path
        self.file_lists = []

    def creat_xlsx(self, directory_path):
        obj = Workbook()
        if not os.path.exists(directory_path + os.sep + 'joined'):
            os.mkdir(directory_path + os.sep + 'joined')
        date = str(datetime.datetime.today())[0:10]
        obj.save(directory_path + os.sep + 'joined' + os.sep + 'joined {}.xlsx'.format(date))

    def get_file_list(self, directory_path):
        entry_lists = os.scandir(directory_path)
        for entry_list in entry_lists:
            if entry_list.is_file():
                if '~$' not in entry_list.path:
                    self.file_lists.append(entry_list.path)
        return self.file_lists

    def run(self, directory_path):
        file_lists = self.get_file_list(directory_path)
        self.creat_xlsx(directory_path)
        destination_file = str(self.get_file_list(directory_path + os.sep + 'joined')[-1])
        file_lists.pop(-1)
        return file_lists, destination_file


if __name__ == "__main__":
    directory_path = r'D:\Excel目录'
    param = ParameterGenerator()
    source_file_list, destination_file = param.run(directory_path)
    copy_excel_file(source_file_list, destination_file)

 

输出是文件夹下新建一个’joined‘的文件夹,里面有一个合并后的文件’joined xxxx-xx-xx.xlsx’,如下:

 

 

 

 

目前发现有两个需要注意的问题:

1. 需要合并的文件中不能有隐藏的表格,否则,会跳过该文件;

2. 文件名中不可以字符意外的标记,比如括号之类的。

 

最后,调用接口的速度有点慢,以后有机会还是看openpyxl是否可以实现一下,含格式的合并。xlwings是类似的实现,估计速度也差不多的慢。

posted @ 2020-03-29 01:38  Johnthegreat  阅读(539)  评论(0编辑  收藏  举报