콘솔워크

두 엑셀파일을 비교하여, 다른 데이터가 있는 경우 색깔로 표시해주는 파이썬 코드 본문

프로그래밍/python

두 엑셀파일을 비교하여, 다른 데이터가 있는 경우 색깔로 표시해주는 파이썬 코드

콘솔워크 2024. 5. 9. 11:09
반응형
import openpyxl
from openpyxl.styles import PatternFill


class CompareExcel:
    def __init__(self, file_a, file_b, key_column, compare_columns):
        self.file_a = file_a
        self.file_b = file_b
        self.key_column = key_column
        self.compare_columns = compare_columns
        self.wb1 = None
        self.wb2 = None
        self.ws1 = None
        self.ws2 = None
        self.yellow_fill = PatternFill(start_color="FFFFFF00", end_color="FFFFFF00", fill_type="solid")

    def load_workbooks(self):
        self.wb1 = openpyxl.load_workbook(self.file_a)
        self.wb2 = openpyxl.load_workbook(self.file_b)
        self.ws1 = self.wb1.active
        self.ws2 = self.wb2.active

    def find_column_index(self, column_name):
        for cell in self.ws1[2]:  # 두 번째 행부터 검색
            if cell.value == column_name:
                return cell.column
        return None

    def compare_rows(self):
        key_column_index = self.find_column_index(self.key_column)
        if key_column_index is None:
            print(f"{self.file_a} 파일에 '{self.key_column}' 컬럼이 없습니다.")
            return

        compare_column_indexes = [self.find_column_index(column) for column in self.compare_columns]
        if None in compare_column_indexes:
            missing_columns = [
                self.compare_columns[i] for i, index in enumerate(compare_column_indexes) if index is None
            ]
            print(f"{self.file_a} 파일에 '{', '.join(missing_columns)}' 컬럼이 없습니다.")
            return

        for row in self.ws2.iter_rows(min_row=3):  # 세 번째 행부터 비교 시작
            key_value = row[key_column_index - 1].value

            # A.xlsx에서 해당 키 값을 가진 행 찾기
            for row1 in self.ws1.iter_rows(min_row=3):  # 세 번째 행부터 검색
                if row1[key_column_index - 1].value == key_value:
                    for i, column_index in enumerate(compare_column_indexes):
                        if row1[column_index - 1].value != row[column_index - 1].value:
                            row[column_index - 1].fill = self.yellow_fill
                    break

    def save_workbook(self):
        self.wb2.save(self.file_b)

    def run(self):
        self.load_workbooks()
        self.compare_rows()
        self.save_workbook()


# 사용 예시
if __name__ == "__main__":
    A_EXCEL = r"C:\consolework\north-outdoor-crawler\output\20240509\노스\노스_남성-자켓&조끼-다운&패딩\노스_남성-자켓&조끼-다운&패딩_20240509_스스양식.xlsx"
    B_EXCEL = r"C:\consolework\north-outdoor-crawler\output\20240509\노스\노스_남성-자켓&조끼-다운&패딩\노스_남성-자켓&조끼-다운&패딩_20240509_스스양식2.xlsx"
    compare_excel = CompareExcel(
        A_EXCEL, B_EXCEL, "판매자 상품코드", ["옵션값", "옵션가", "판매가", "옵션 재고수량", "재고수량"]
    )
    compare_excel.run()

 

 

해설

판매자 상품코드가 같은 행끼리 비교하여, 원하는 컬럼["옵션값".. 등]에 데이터가 변경된 경우 노랑색으로 표시해주는 코드입니다.

 

키 컬럼은 각 시트에 unique 값일 경우로 가정했습니다.

반응형