在做数据处理的工作中,经常会遇见多个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)
执行完成,生成新的文件