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該如何處理

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