文章目录
- 需求描述
- 解决思路
- 执行步骤
- 键盘输入并保存待处理/输出excel目录
- 定义常量--待处理的工作表名,导出的工作簿名
- 输出excel目录下创建新工作簿
- 遍历待处理excel目录下的所有工作簿
- 分析报告
- 完整代码
需求描述
Excel导出并处理数据:
1、多个Excel工作簿待处理
2、Excel工作簿中的多个工作表待处理
3、Excel工作表的多个数据待处理
解决思路
- 键盘输入并保存待处理excel目录和excel输出目录
- 在excel输出目录下创建新工作簿,修改表内行列名,返回输出目录+新建工作簿名的完整路径
- 遍历待处理excel目录下的所有工作簿,同时判断遍历的工作簿是否存在需要处理的工作表,如果需要,接5;不需要,接4
- 退出
- 将遍历到的当前工作簿中待处理表的数据进行处理,存入新建的工作簿的工作表中,直到遍历完全部工作簿,退出
执行步骤
键盘输入并保存待处理/输出excel目录
file_dir = input("输入待处理excel目录:")
file_new_dir = input("输入excel输出目录:")
定义常量–待处理的工作表名,导出的工作簿名
# 待处理工作表名
OVERVIEW_TABLE_NAME = '测试概况总览'
# 导出工作簿名=自定义excel名+年月日时分秒
RESULT_FILE_PREFIX = '测试报告汇总'
RESULT_FILE_NAME = '{}_{}.xlsx'.format(RESULT_FILE_PREFIX, datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
输出excel目录下创建新工作簿
在excel输出目录下创建新工作簿,修改表内行列名,返回输出目录+新建工作簿名的完整目标文件路径
def create_report_file(target_path):
"""
:param target_path: 目标路径
:return: 目标文件路径
"""
# 设置item为全局变量,初始化为1
global item
# 拼接路径=输出excel路径+自定义的输出excel名称
target_file_path = os.path.join(target_path, RESULT_FILE_NAME)
# 判断当前输出路径下是否已存在要创建的新工作簿
if not os.path.exists(target_file_path):
# 创建一个新工作簿
workbook = openpyxl.Workbook()
# 获取到活动表
sheet = workbook.active
# 设置表名,不设置默认“sheet”
sheet.title = '总览'
# 设置表第一行四个单元格填入内容
sheet[f'A{item}'] = '名称'
sheet[f'B{item}'] = '系统类别'
sheet[f'C{item}'] = '设备组'
sheet[f'D{item}'] = '综合通过率'
# 将内容写入文件
workbook.save(target_file_path)
item = item + 1
return target_file_path
遍历待处理excel目录下的所有工作簿
遍历待处理excel目录下的所有工作簿,同时判断遍历的工作簿是否存在需要处理的工作表
def resolve_files(source_path, target_file_path):
"""
:param source_path: 来源路径
:param target_file_path: 目标报告路径
:return: null
"""
# 遍历路径下所有文件
for file in os.listdir(source_path):
# 判断该工作簿中是否存在要处理的工作表
if RESULT_FILE_PREFIX not in file:
print(file)
# 如果存在,则进行处理
analyze_report(os.path.join(source_path, file), target_file_path)
分析报告
def analyze_report(files, target_file_path):
"""
:param files: 原始报告文件
:param target_file_path: 目标文件路径
:return:
"""
global item
# 打开名为files值的已存在的工作簿
workbook = openpyxl.load_workbook(files)
try:
# 获取名为OVERVIEW_TABLE_NAME值的工作表
sheet = workbook[OVERVIEW_TABLE_NAME]
# 设置一个字典,将想要处理的数据放入字典一一对应
result = {
'package_name': sheet['C2'].value,
'os_type': sheet['C4'].value,
'group_type': sheet['E4'].value.upper(),
'passing_rate': sheet['A7'].value,
}
print("录入内容读出:{}".format(result)) # 输出测试
# 打开刚刚创建的新工作簿
workbook = openpyxl.load_workbook(target_file_path)
sheet = workbook.active
# 将字典中的数据一一填入单元格
sheet[f'A{item}'] = result['package_name']
sheet[f'B{item}'] = result['os_type']
sheet[f'C{item}'] = result['group_type']
sheet[f'D{item}'] = result['passing_rate']
item = item + 1
workbook.save(target_file_path)
workbook.close()
except KeyError as e:
print(f'[{files}] - Sheet名未找到')
完整代码
import datetime
import os
import openpyxl
item = 1
# 待处理工作表名
OVERVIEW_TABLE_NAME = '测试概况总览'
# 导出工作簿
RESULT_FILE_PREFIX = '测试报告汇总'
RESULT_FILE_NAME = '{}_{}.xlsx'.format(RESULT_FILE_PREFIX, datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
def analyze_report(files, target_file_path):
"""
分析报告
:param files: 原始报告文件
:param target_file_path: 目标文件路径
:return:
"""
global item
workbook = openpyxl.load_workbook(files) # 返回一个workbook数据类型的值
try:
sheet = workbook[OVERVIEW_TABLE_NAME] # 获取活动表
result = {
'package_name': sheet['C2'].value,
'os_type': sheet['C4'].value,
'group_type': sheet['E4'].value.upper(),
'passing_rate': sheet['A7'].value,
}
print("录入内容读出:{}".format(result)) # 输出
workbook = openpyxl.load_workbook(target_file_path)
sheet = workbook.active
sheet[f'A{item}'] = result['package_name']
sheet[f'B{item}'] = result['os_type']
sheet[f'C{item}'] = result['group_type']
sheet[f'D{item}'] = result['passing_rate']
item = item + 1
workbook.save(target_file_path)
workbook.close()
except KeyError as e:
print(f'[{files}] - Sheet名未找到')
def resolve_files(source_path, target_file_path):
"""
处理文件
:param source_path: 来源路径
:param target_file_path: 目标报告路径
:return:
"""
for file in os.listdir(source_path):
if RESULT_FILE_PREFIX not in file:
print(file)
analyze_report(os.path.join(source_path, file), target_file_path)
def create_report_file(target_path):
"""
创建新的文件
:param target_path: 目标路径
:return: 目标文件路径
"""
global item
target_file_path = os.path.join(target_path, RESULT_FILE_NAME)
if not os.path.exists(target_file_path):
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = '总览'
sheet[f'A{item}'] = '名称'
sheet[f'B{item}'] = '系统类别'
sheet[f'C{item}'] = '设备组'
sheet[f'D{item}'] = '综合通过率'
workbook.save(target_file_path)
item = item + 1
return target_file_path
if __name__ == '__main__':
file_dir = input("输入待处理excel目录:")
file_new_dir = input("输入excel输出目录:")
target_file_path = create_report_file(file_new_dir)
resolve_files(file_dir, target_file_path)