python处理两个Excel并且根据相同字段合并写入一个新的Excel

该博客介绍了一个Python脚本,用于处理多个Excel文件的合并。通过封装`EncapsulationExcel`和`OperationExcel`类,实现了读取Excel、合并具有关联字段的数据以及写入新Excel的功能。在主函数中,`ExcelEncapsulation`类接收两个Excel文件,根据指定字段进行匹配合并,并将结果保存到新的Excel文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做数据处理的工作中,经常会遇见多个Excel文件,然后内容不同,有关联字段,需要将其合并在一起,然后生成一个新的文件放在一个新的excel里。

# 1.首先我们需要封装两个类

①一个类是专门读取Excel的,当然也可以封装单独写入到Excel,如果想在当行里边加

② 其次我们可以封装另外一个类,把两个Excel表的字段全部遍历出来,然后组合成嵌套列表的字典,然后再插入

新建一个

handle_excel.py
import openpyxl
from openpyxl import load_workbook


class EncapsulationExcel:
    """封装Excel
    """

    def __init__(self, filename, sheet=None):
        self.filename, self.sheet = filename, sheet

    def operation_excel(self):
        """操作Excel获取数据
        :return:
        """
        # 1.打开Excel
        wb = load_workbook(self.filename)
        # 2.定位表单
        if self.sheet is None:
            ws = wb.active
        else:
            ws = wb[self.sheet]
        # 3.获取表数据
        values = tuple(ws.iter_rows(min_row=1, max_row=1, values_only=True))
        sheet_head_tuple = values[0]
        cases_list = []  # 将数据字典信息, 存放在列表中, 这个列表就是嵌套字典列表
        for data in tuple(ws.iter_rows(min_row=2, values_only=True)):
            cases_list.append(dict(zip(sheet_head_tuple, data)))

        return cases_list

    def write_result(self, row, col, result):
        """操作Excel数据,写入数据
        """
        other_wb = load_workbook(self.filename)
        if self.sheet is None:
            other_ws = other_wb.active
        else:
            other_ws = other_wb[self.sheet]

        # if isinstance(row, int) and (2 <= row <= other_ws.max_row):
        if isinstance(row, int) and (row >= 2):
            # row表示行,column表示列,value表示插入值
            other_ws.cell(row=row, column=col, value=result)
            other_wb.save(self.filename)
        else:
            print("传入的行号有误,行号应大于1的整数")


class OperationExcel(object):
    """处理Excel数据,并且写入
    """

    def __init__(self, sheet):
        """
        根据嵌套字典获取Excel的表头
        :param sheet: 定义一个sheet的名称
        """
        self.wb = openpyxl.Workbook()
        self.ws = self.wb.create_sheet(index=0, title=sheet)

    def get_title(self, data):
        """
        :param data: 传入json数据的嵌套字典
        :return: 返回所有字典的标题(keys)
        """
        title_list = []
        for dic in data:
            for key in dic:
                if key not in title_list:
                    title_list.append(key)

        return title_list

    def handle_data(self, title_list, data, filename):
        """
        :param data: 调用get_title返回的标题列表
        :param data: 传入json数据的嵌套字典
        :return: 返回所有字典的标题(keys)
        """
        # 1. 把列表的标题插入Excel的第一行
        first_row = 1
        for header in title_list:
            col = title_list.index(header)
            self.ws.cell(first_row, col + 1, header)
        # 2. 把所有的值,根据标题去筛选,插入excel
        row = 2
        for player in data:
            for _key, _value in player.items():
                col = title_list.index(_key)
                self.ws.cell(row, col + 1, _value)
            row += 1  # enter the next row
        self.wb.save(filename)
        self.wb.close()


if __name__ == '__main__':
    filename = "上海数据.xlsx"
    sheet = "数据清洗"
    data = [{'欢迎': 4, "马上": 3, "登录": "成功"}, {'欢迎': 5, "马上": 7, "退出": "成功"}, {'欢迎': 9, "马上": 8, "注册": "失败"}]
    A = OperationExcel(sheet)
    title_list = A.get_title(data)
    # 清洗数据,写入Excel
    A.handle_data(title_list=title_list,
                  data=data,
                  filename=filename)

# 2.我们需要处理数据,把上边的那个文件的代码导入

from handle_excel import EncapsulationExcel, OperationExcel


class ExcelEncapsulation(object):
    def __init__(self, file_name_1, file_name_2):
        """初始化数据
        """
        self.file_name1 = file_name_1
        self.file_name2 = file_name_2

    def write_excel_data(self, field_name_1, field_name_2, filename, sheetname):
        one_excel = EncapsulationExcel(filename=self.file_name1)
        two_excel = EncapsulationExcel(filename=self.file_name2)
        A = one_excel.operation_excel()
        B = two_excel.operation_excel()
        list_data = []
        for i in A:
            for j in B:
                if i[field_name_1] == j[field_name_2]:
                    j.update(i)
                    list_data.append(j)
        C = OperationExcel(sheetname)
        title_list = C.get_title(list_data)
        # 清洗数据,写入Excel
        C.handle_data(title_list=title_list,
                      data=list_data,
                      filename=filename)


if __name__ == '__main__':
    # 要比较的Excel文件名
    file_name_one = "截止20220612付费证书用户信息.xlsx"
    file_name_two = '成本数据_1654850871000.xlsx'
    # 要比较的两个Excel的相同的字段名
    field_name_one = '购买UIN'
    field_name_two = 'uin'
    # 创建新的Excel的文件名
    file_name = "文件名.xlsx"
    # 创建新的sheet名字
    sheet_name = "数据清洗"
    ExcelEncapsulation(file_name_one, file_name_two).write_excel_data(field_name_one, field_name_two, file_name,
                                                                      sheet_name)

执行完成,生成新的文件

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

您懂我意思吧

你的鼓励,是我最大的支持!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值