文章目录

  • 需求描述
  • 解决思路
  • 执行步骤
  • 键盘输入并保存待处理/输出excel目录
  • 定义常量--待处理的工作表名,导出的工作簿名
  • 输出excel目录下创建新工作簿
  • 遍历待处理excel目录下的所有工作簿
  • 分析报告
  • 完整代码


需求描述

Excel导出并处理数据:
1、多个Excel工作簿待处理
2、Excel工作簿中的多个工作表待处理
3、Excel工作表的多个数据待处理

解决思路

  1. 键盘输入并保存待处理excel目录excel输出目录
  2. PYthon 批量excel区域复制数据 python怎么批量处理excel_表名

  3. 在excel输出目录下创建新工作簿,修改表内行列名,返回输出目录+新建工作簿名的完整路径
  4. PYthon 批量excel区域复制数据 python怎么批量处理excel_表名_02

  5. 遍历待处理excel目录下的所有工作簿,同时判断遍历的工作簿是否存在需要处理的工作表,如果需要,接5;不需要,接4
  6. PYthon 批量excel区域复制数据 python怎么批量处理excel_表名_03

  7. 退出
  8. 将遍历到的当前工作簿中待处理表的数据进行处理存入新建的工作簿的工作表中,直到遍历完全部工作簿,退出

执行步骤

键盘输入并保存待处理/输出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

PYthon 批量excel区域复制数据 python怎么批量处理excel_文件路径_04

遍历待处理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)