Hiromi1623
@Hiromi1623

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

2つのExcelファイルの差分抽出プログラム

Q&A

Closed

解決したいこと

2つのExcelファイルを比較して、差分を新たなExcelファイルに出力するプログラムを作成しているのですが、比較するファイルにシートが1つではなく複数あった場合で差分を出力できるようにしたいです。

発生している問題・エラー

UnboundLocalErro「cannot access local variable 'sheet_name' where it is not associated with a value」と出てしまい実行できません。

該当するソースコード

import pandas as pd

def compare_excel_files(file_path1, file_path2,sheet_names):
    # シート名を指定
    sheet_name = 'シート名1,シート名2'

    # 出力データを格納するリスト
    output_data = []

    # Excelファイルを読み込む
    df01 = pd.read_excel(file_path1, sheet_name=sheet_name)
    df02 = pd.read_excel(file_path2, sheet_name=sheet_name)

    for sheet_name in sheet_names:

    # データの差分を抽出
        df1=df01[sheet_name]
        df2=df02[sheet_name]
        diff_data = df2[df2 != df1]
        diff_data.dropna(how='all', inplace=True)

    # 差分がある場合は出力データに追加
        if not diff_data.empty:
        # 差分データを整形して出力データに追加
            for row_index, row in diff_data.iterrows():
                for col_name, cell_value in row.iteritems():
                    if pd.notnull(cell_value):
                    # シート名、セル、Excel1ファイルの該当する内容、Excel2ファイルの該当する内容を出力データに追加
                        output_data.append([sheet_name, f"{col_name}{row_index}", df1.loc[row_index, col_name], df2.loc[row_index, col_name]])

    # 出力データをDataFrameに変換
    output_df = pd.DataFrame(output_data, columns=['Sheet Name', 'Cell', 'Excel1', 'Excel2'])

    # 出力データをExcelファイルに保存
    output_df.to_excel("出力ファイル名.xlsx", index=False)

# ファイルのパスを指定してデータを比較
file_path1 = "Excel1.xlsx"
file_path2 = "Excel2.xlsx"
sheet_names=['シート名1','シート名2']
compare_excel_files(file_path1, file_path2,sheet_names)

自分で試したこと

差分プログラムの作成

0

1Answer

sheet_name = 'シート名1,シート名2'
sが抜け落ちています。リスト型でもないです。

for sheet_name in sheet_names:

sheet1 = 'sheet1'
sheet2 = 'sheet2' で良いのでは

pandas凄いです。df.to_htmlで全シートをテーブルにしてくれます。

0Like

Comments

  1. @Hiromi1623

    Questioner

    返信ありがとうございます。
    pd.read_excelの部分を「=None」にすることで解決できました。
    ありがとうございました。

Your answer might help someone💌