現狀描述:
因每天需要接收各個小組的工作日報,由我彙總到一個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、如果目標Excel文件已存在該如何處理
2、如果源Excel文件裏面有多個sheet該如何處理