python用openpyxl操作excel-合并格式相同的excel文件

python用openpyxl操作excel-合并指定路径下格式相同的excel文件,参见如下实列代码

python 复制代码
import logging
import com.pro001.log.pro_log_config as pro_log_config #参见另一篇博文
from openpyxl import Workbook, load_workbook
from openpyxl.styles import  Font, Alignment, Side, PatternFill, Border
import os
import datetime
import random
import pandas as pd


def merge_all_excel(base_dir, output_excel_name):
    """ 合并指定路径下所有格式即列名名相同的
    Excel文件(仅含一或多个sheet)的内容到新的Excel文件中 """
    try:
        if not os.path.exists(base_dir):
            logger.error(f'路径{base_dir}不存在!')
            return None
        suffix = '.xlsx'
        # 获取当前路径下所有开头为excelFile或myExcel,后缀为 .xlsx 的文件放到列表中
        excel_list = [f for f in os.listdir(base_dir) if f.lower().endswith(suffix) \
                      and (f.startswith('excelFile') or f.startswith('myExcel'))]
        if not excel_list:
            logger.error(f'路径{base_dir}下不存在{suffix}的Excel文件!')
            return None

        # 创建一个空的列表用于存储所有的DataFrame对象
        df_list = []
        # 遍历所有Excel文件,读取内容到DataFrame对象中
        for excel_file in excel_list:
            file_path = os.path.join(base_dir, excel_file)
            '''------每个excel文件仅有一个sheet的情况------'''
            '''
            df = pd.read_excel(file_path)
            # 合并前增加一列展示数据来源哪个文件
            df['来源文件'] = os.path.basename(excel_file)
            # 合并前删除无效列
            df = df.drop(columns=['某列名01','某列名02']) # 删除某多列
            #df = df.drop(columns=['某列名01'], axis=1) # 仅删除某列 axis=0为按行,1为按列
            # 合并前删除重复行
            df = df.drop_duplicates()
            # 合并前删除空行
            df = df.dropna(how='all')
            # 合并前删除空列,axis=0表示按行删除, axis=1表示按列删除, how='all'表示删除所有空行
            df = df.dropna(how='all', axis=1)
            # 合并前删除重复列
            df = df.loc[:, ~df.columns.duplicated()]
            if df:
                df_list.append(df)
                logger.info(f'文件{file_path}读取成功,包含{len(df)}行数据!')
            else:
                logger.error(f'文件{file_path}读取返回无效数据')
            '''

            ''' -----每个 excel 文件有一或多个数据格式相同 sheet 的情况,兼容上面仅有一个sheet的情况-----'''
            xlsx_file = pd.ExcelFile(file_path)
            for sheet_name in xlsx_file.sheet_names:
                tmp_df = xlsx_file.parse(sheet_name)
                tmp_df['来源文件'] = os.path.basename(excel_file)
                tmp_df['来源sheet'] = sheet_name
                # 合并前删除无效列,删除空行,去重等操作
                tmp_df = tmp_df.drop(columns=['某列名01','某列名02']) # 删除某多列
                #tmp_df = tmp_df.drop(columns=['某列名01'], axis=1) # 仅删除某列 axis=0为按行,1为按列
                tmp_df = tmp_df.drop_duplicates()
                tmp_df = tmp_df.dropna(how='all')
                tmp_df = tmp_df.dropna(how='all', axis=1)
                tmp_df = tmp_df.loc[:, ~tmp_df.columns.duplicated()]
                if tmp_df:
                    df_list.append(tmp_df)
                    logger.info(f'文件{file_path}的{sheet_name}工作表读取成功,包含{len(tmp_df)}行数据!')
                else:
                    logger.error(f'文件{file_path}的{sheet_name}工作表读取返回无效数据')

        # 判断是否有有效的合并sheet数据文件
        if not df_list:
            logger.error(f'没有有效的合并sheet数据文件!')
            return None

        # 生成新的Excel文件名称
        new_excel_name =''
        if not output_excel_name or not output_excel_name.lower().endswith(suffix):
            new_excel_name = datetime.datetime.now().strftime('%Y%m%d_%H%M%S') + suffix
            new_excel_name = 'F' + new_excel_name
        new_excel_name = os.path.join(base_dir, new_excel_name)

        # 合并所有 df 对象,忽略前面的索引列
        merged_df = pd.concat(df_list, ignore_index=True)
        # 合并后的内容写入到新的 Excel 文件中
        merged_df.to_excel(new_excel_name, index=False)
        # 保存合并后的结果到新的Excel文件中
        logger.info(f'合并后的Excel文件见:{new_excel_name}')
        return new_excel_name
    except Exception as e:
        logger.error(f'合并excel异常文件,info: \n{e}')
        return None


def main():
    """主函数"""
    base_dir = r'F:\appData\tempExcel'    
    merge_all_excel(base_dir, 'mergeExcelFile01.xlsx')
    


if __name__ == '__main__':
    print('-' * 60)
    main()
相关推荐
华如锦6 分钟前
四:从零搭建一个RAG
java·开发语言·人工智能·python·机器学习·spring cloud·计算机视觉
向阳蒲公英19 分钟前
Pycharm2025版本配置Anaconda步骤
python
Darkershadow25 分钟前
蓝牙学习之uuid与mac
python·学习·ble
北海有初拥28 分钟前
Python基础语法万字详解
java·开发语言·python
Mqh1807621 小时前
day61 经典时序模型3
python
我想吃烤肉肉1 小时前
logger比print优秀之处
python
Cosmoshhhyyy1 小时前
《Effective Java》解读第32条:谨慎并用泛型和可变参数
java·python
Cherry的跨界思维1 小时前
【AI测试全栈:Vue核心】19、Vue3+ECharts实战:构建AI测试可视化仪表盘全攻略
前端·人工智能·python·echarts·vue3·ai全栈·ai测试全栈
海棠AI实验室2 小时前
第十七章 调试与排错:读懂 Traceback 的方法论
python·pandas·调试
2501_941878742 小时前
在奥克兰云原生实践中构建动态配置中心以支撑系统稳定演进的工程经验总结
开发语言·python