Python自动化复制整张Excel表的内容

现状描述:

因每天需要接收各个小组的工作日报,由我汇总到一个Excel里面,该Excel分成多个sheet展示。每个小组的日报复制粘贴容易出错,且重复性劳动,于是想用python来实现自动化拷贝。

需求描述:

把源Excel文件的内容全部拷贝至目标Excel文件里面,并保持格式不变。
1、各个小组的Excel汇总在一个Excel文件里,分成不同的sheet页面
2、汇总过后的Excel格式不变。如图。:在这里插入图片描述

伪代码编辑:

1.我要知道是哪个目录
2.我要知道这个目录下面有哪些文件(即遍历文件夹内容)
3.选出符合我要求的Excel文件(排除我的目标Excel文件–汇总)
4.新建一个Excel文件叫汇总
5.把一个符合要求的Excel文件拷贝至汇总Excel里,并且每一个Excel装在不同的sheet里面,sheet命名为文件名称
6.复制的Excel文件要已源文件格式一致
7.保存新excel文件

以下代码是经过测试,已达到目的。不过还有待完善。
代码实现:
所在环境:windows10,python3.5.2,pycharm工具。
函数功能代码片:

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

from openpyxl import Workbook;
from openpyxl import load_workbook;
import openpyxl;
import os;
from copy import  copy;
# 遍历指定目录,显示目录下的所有文件名
#os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下
# (dirpath, dirnames, filenames)【文件夹路径, 文件夹名字, 文件名】
# path:C:\Users\Desktop\跟踪日志20200424
def get_file_name(path):
    """
    遍历该文件夹下的所有Excel文件
    :param path: 文件的路径
    :return:返回一个文件路径列表
    """
    file_name_list =[];#文件名所在的路径
    fpath = [];
    for fpath, dirname, fname in os.walk(path):
        # print(fpath);
        if len(dirname) > 0:
            # 打印所有的文件夹名称
            print("打印所有的文件夹名称:", dirname);
        else:
            print("该%s文件路径下已无文件夹"%dirname);
        # 遍历文件名称
        for name in fname:
            # 把文件名和路径一起显示
            print(name);
            filename = os.path.join(fpath,name)
            if filename.endswith(".xlsx"):
                file_name_list.append(filename);

    return file_name_list;


def create_excel(excel_path):
    """
    新建一个Excel文件,叫汇总.xlsx
    :param excel_path: 创建目标Excel所在的路径
    :return: 返回一个成功标志的语句
    """
    # excel_path= 'C:\Users\Desktop\跟踪日志20200424';
    os.chdir(excel_path);
    # 新建Excel
    work_book = openpyxl.Workbook();
    work_book.save("跟踪汇总.xlsx");
    if os.path.exists(excel_path):
        return '该文件已成功创建';

def excel_copy(src_filename,tag_filename):
    """
    把源excel文件复制到目标Excel中的一个sheet里,源sheet名称作为目标sheet的名称,然后保存
    :param src_filename:源Excel文件名称
    :param tag_filename:目标Excel文件名称
    :return:
    """

    # 获取源Excel文件所在的路径及其文件名
    src_file_workbook = openpyxl.load_workbook(filename=src_filename);
    # 获取源Excel文件的sheet名称
    src_file_sheet = src_file_workbook.worksheets[0];

    # 获取目标Excel文件名称,并把源Excel文件的sheet名为目标Excel文件的sheet名
    # 获取目标Excel文件所在的路径及其文件名
    tag_file_workbook = openpyxl.load_workbook(filename=tag_filename);
    sheet_copy = src_file_workbook.copy_worksheet(src_file_sheet);
    # 以源Excel文件的sheet名称在目标Excel文件创建一个同样的sheet名称
    # tag_file_sheet = tag_file_workbook.create_sheet(sheet_copy.title);
    tag_file_sheet = tag_file_workbook.create_sheet(src_file_sheet.title);
    '''
    遍历整个sheet行列的数据
    '''
    #读取源Excel文件的所有行
    for row in src_file_sheet:
        # 读取源Excel文件的所有列单元格
        for cell in row:
            tag_file_sheet[cell.coordinate].value = cell.value;
            #复制Excel样式
            if cell.has_style:
                tag_file_sheet[cell.coordinate].font = copy(cell.font)
                tag_file_sheet[cell.coordinate].border = copy(cell.border)
                tag_file_sheet[cell.coordinate].fill = copy(cell.fill)
                tag_file_sheet[cell.coordinate].number_format = copy(cell.number_format)
                tag_file_sheet[cell.coordinate].protection = copy(cell.protection)
                tag_file_sheet[cell.coordinate].alignment = copy(cell.alignment)

    wm = list(zip(src_file_sheet.merged_cells))  # 开始处理合并单元格
    if len(wm) > 0:
        for i in range(0, len(wm)):
            cell2 = str(wm[i]).replace('(<CellRange ', '').replace('>,)', '')
            print("CellRange : %s" % cell2)
            tag_file_sheet.merge_cells(cell2);
    tag_file_workbook.save(tag_filename);
    tag_file_workbook.close();
    src_file_workbook.close();

测试代码片.

from excel_copy import *;
excel_path= 'C:\\Users\\Desktop\\跟踪日志20200424\\20200424';
tag_filename = 'C:\\Users\\Desktop\\跟踪日志20200424\\跟踪汇总.xlsx'
# 文件所在路径
file_list= get_file_name(excel_path);
for flist in file_list:
    # if os.path.exists(excel_path):
    #     create_excel(excel_path);
    # else:
    #     os.remove(tag_filename);
    excel_copy(flist,tag_filename)

操作难点:

  1. 合并单元格有点难度

还有待完善已知的点:

1、如果目标Excel文件已存在该如何处理
2、如果源Excel文件里面有多个sheet该如何处理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章