使用Python批量合并多个工作簿中的同名工作表

批量合并多个工作簿中的同名工作表

使用Python的xlwings模块批量合并多个工作簿中的同名工作表

import os
import xlwings as xw
import pandas as pd
'''
批量合并多个工作簿中的同名工作表
'''
# 给出要合并的工作表的文件路径
file_path = r'E:\pythonExample\01\要合并的表'
# 给出文件夹下所有文件的名称
file_list = os.listdir(file_path)
# 给出要合并的同名工作表的名称
sheet_name = '实验项目表'
# 定义变量header,初始值为一个空对象,后面用于存放要合并的工作表中数据的列标题
header = None
# 定义一个空列表,用于存放要合并的数据
all_data = []
# 合并记录总分
sum_rows = 0
# 启动Excel应用程序
app = xw.App(visible=True, add_book=False)
'''1遍历要合并Excel的文件夹下的文件名称'''
for i in file_list:
    if i.startswith('~$'):
        continue
    # 构造要合并的工作簿的文件路径
    file_paths = os.path.join(file_path,i)
    # 打开要合并的工作簿
    workbook = app.books.open(file_paths)
    sheetnames = workbook.sheets
    '''2遍历工作簿中的工作表'''
    for j in sheetnames:
        # 3判断工作表的名称是否为“实验项目表”
        if j.name == sheet_name:
            # 4判断变量header变量中是否已经存放了列标题
            if header == None:
                # 如果未存放,则读取列标题并赋给变量header
                header = j['A1:W5'].value
            # 5读取要合并工作表中的数据,用j['A6'].expand('table').value时中间有空格会中断数据
            max_rows = j.used_range.last_cell.row
            max_columns = j.used_range.last_cell.column
            # 6获取数据内容
            values = j[f'A6:W{max_rows}'].value
            '''
            7每一张表中检查每一行数据,是否有整行为空的记录,使用列表倒序方法删除列表中元素的全为None值的空行
            解析:values = [n for n in values if  any(n)]
            过虑:values = filter(lambda x : any(x),values)
            '''

            # for k in range(len(values)-1,-1,-1):
            #     # 判断每一条记录(k中)的元素全为None时返回True,或者用all(i is None for i in k)
            #     if not any(values[k]):
            #         # 进行删除行
            #         values.remove(values[k])
            print(values)
            # 8合并多个工作簿中的同名工作表数据
            all_data = all_data + values
            # 可以最后总的数据进行过虑
            all_data = [n for n in all_data if any(n)]
    print(j)
print(all_data)
print('合并的记录数all_data:%d ' %(len(all_data)))
# 9新建工作簿,等同app.books.add()
new_workbook = xw.Book()
# 10在新建的工作簿中新建工作表,名称为指定的合并的工作表名称
new_worksheet = new_workbook.sheets.add(sheet_name)
# 11将要合并的工作表的列标题复制写入至新增工作表中
new_worksheet['A1'].value = header
# 12将合并后的工作表数据内容复制写入到新增工作表中
new_worksheet['A6'].value = all_data
# 13根据合并后数据内容自动调整新增工作表的行高和列宽,autofie(axis=None),
'''格式样式设置'''
"""合并单元格"""
# 合并单元格
new_worksheet.range('A1:W1').merge()
new_worksheet.range('A2:W2').merge()
new_worksheet.range('A3:W3').merge()
"""设置边框,
与可以用for循环写:
# 遍历每一个单元格,设置边框线
        for cell in j['A1'].expand('table'):
            #  对每一个单元的四周(7,8,9,10)画线,数字表示四边代号
            for b in range(7, 12):
                # 设置单元格的边框线型
                cell.api.Borders(b).LineStyle = 1
                # 设置单元格的边框粗细
                cell.api.Borders(b).Weight = 2
"""
# 边框线: Borders(5) 单元格内从左上角 到 右下角。
# new_worksheet.range(f'A4:W{len(all_data)}').api.Borders(5).LineStyle = 1
# new_worksheet.range(f'A4:W{len(all_data)}').api.Borders(5).Weight = 3
# Borders(6) 单元格内从左下角 到 右上角。

# Borders(7) 左边框,LineStyle = 2 虚线。
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(7).LineStyle = 1
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(7).Weight = 3
# Borders(8) 顶部框,LineStyle = 5 双点划线。
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(8).LineStyle = 1
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(8).Weight = 3
# Borders(9) 底部边框,LineStyle = 1 直线。
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(9).LineStyle = 1
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(9).Weight = 3
# Borders(10) 右边框,LineStyle = 4 点划线。
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(10).LineStyle = 1
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(10).Weight = 3
# Borders(11) 内部垂直边线。
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(11).LineStyle = 1
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(11).Weight = 3
# Borders(12) 内部水平边线。
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(12).LineStyle = 1
new_worksheet.range(f'A4:W{len(all_data) + 5}').api.Borders(12).Weight = 3

# 参数若设置为'rows'或‘r’,表示自动适应调整行高;若设置为'columns'或'c',表示自动适应调整列宽
new_worksheet.autofit()
"""设置单元格大小"""
# new_workbook.autofit()  # 自动调整单元格大小。注:此方法是在单元格写入内容后,再使用,才有效。
# new_workbook.range(1, 4).column_width = 5  # 设置第4列 列宽。(1,4)为第1行第4列的单元格
new_worksheet.range('A1').row_height = 180  # 设置第1行 行高
"""设置单元格 字体格式"""
new_worksheet.range('A2:A3').api.HorizontalAlignment = -4108  # -4108 水平居中。 -4131 靠左,-4152 靠右。
new_worksheet.range('A2:A3').api.VerticalAlignment = -4108  # -4108 垂直居中(默认)。 -4160 靠上,-4107 靠下, -4130 自动换行对齐。
new_worksheet.range('A2').api.Font.Name = "宋体" # 设置字体
new_worksheet.range('A2').api.Font.Size = 20  # 设置字体的大小。
new_worksheet.range('A2').api.Font.Bold = True  # 设置为粗体。

# 保存工作簿
new_workbook.save(r'E:\pythonExample\01\汇总实验项目表.xlsx')
new_workbook.close()
print("完成合并")
app.quit()


  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值