现状描述:
因每天需要接收各个小组的工作日报,由我汇总到一个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该如何处理