在做數據處理的工作中,經常會遇見多個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)
執行完成,生成新的文件