見出し画像

制作物#2 Excelデータ集約


1.スクリプトの概要

このPythonスクリプトは、ユーザーが指定したディレクトリ内のExcelファイルを収集し、特定のデータを抽出して新しいExcelファイルに統合することを目的としています。ユーザーはグラフィカルユーザーインターフェースを通じてフォルダと保存先ファイルを選択し、スクリプトが自動的にデータを処理して結果を出力します。このスクリプトは、特定の業務プロセスを自動化し、データ集約作業の効率を向上させることを意図しています。

2.主な機能

  1. インタラクティブなフォルダ選択:

    • ユーザーがデータファイルが格納されているフォルダを選択できるようにします。

    • Tkinterを使用したフォルダ選択ダイアログを提供します。

  2. データ抽出と集約:

    • 指定されたディレクトリ内のExcelファイルを走査し、条件に合致するファイルを検出します。

    • 各ファイルから必要なデータ(特定のシートと列範囲)を抽出し、一つのデータフレームに集約します。

    • 抽出データにファイル名を記録する新しい列を追加します。

  3. 進捗状況の表示:

    • データの処理中に進捗を表示するためのGUIウィンドウを設けます。

    • 処理中のファイルと総ファイル数を表示して、進捗状況をリアルタイムで更新します。

  4. 出力ファイルの保存設定:

    • 処理が完了したデータを保存するファイルの名前と場所をユーザーが指定できます。

    • デフォルトの命名規則として処理日と選択されたフォルダ名を含め、ファイル形式としてExcelを指定します。

  5. 処理完了の通知:

    • 全てのファイルの処理が完了した後、完了メッセージを表示してユーザーに通知します。

    • 処理されたファイルの数とデータが保存されたパスをユーザーに伝えます。

例外処理:

  • 選択されたフォルダにExcelファイルが存在しない場合、エラーメッセージを表示し処理を中断します。


3.使用技術

  • 言語: Python

  • 主要ライブラリ: pandas, os, tkinter, datetime

  • ユーザーインターフェース: Tkinterを用いたGUI

4.実行条件

  • 適切なPython環境がセットアップされていること。

  • 必要なライブラリがインストールされていること。

  • 処理対象のファイルが指定された形式(.xlsx)であること。

このスクリプトは、データ処理の自動化により業務の効率化を図るために開発されました。特に、大量のExcelデータを扱う業務でその効果を発揮します。

5.スクリプト

import pandas as pd
import os
from tkinter import Tk, filedialog, Label, messagebox
from datetime import datetime

def select_directory(message):
    """フォルダ選択ダイアログを表示し、選択されたフォルダのパスを返す"""
    root = Tk()
    root.withdraw()  # GUIのメインウィンドウを表示しない
    directory = filedialog.askdirectory(title=message)  # フォルダ選択ダイアログ
    root.destroy()
    return directory

def save_file_dialog(default_name):
    """ファイル保存ダイアログを表示し、保存されるファイルのパスを返す"""
    root = Tk()
    root.withdraw()
    file_path = filedialog.asksaveasfilename(
        title='保存先を選択してください',
        initialfile=default_name,
        defaultextension='.xlsx',
        filetypes=[('Excel Files', '*.xlsx')]
    )
    root.destroy()
    return file_path

def process_files(input_directory, output_path, sheet_name, data_range):
    """指定されたフォルダ内のExcelファイルを処理し、集約したデータを指定されたパスに保存する
    sheet_name: 読み込むシート名
    data_range: 読み込むデータの列範囲 (例: 'A:AF')"""
    compiled_data = pd.DataFrame()
    files = [f for f in os.listdir(input_directory) if f.endswith('.xlsx')]
    total_files = len(files)

    if total_files == 0:
        messagebox.showinfo("情報", "処理するExcelファイルが見つかりませんでした。")
        return

    progress_root = Tk()
    progress_label = Label(progress_root, text='処理中...')
    progress_label.pack()
    progress_root.update()

    for idx, filename in enumerate(files):
        file_path = os.path.join(input_directory, filename)
        data = pd.read_excel(file_path, sheet_name=sheet_name, usecols=data_range, nrows=1)
        data['ファイル名'] = filename  # 新しい列「ファイル名」にファイル名を格納
        compiled_data = pd.concat([compiled_data, data], ignore_index=True)
        progress_label.config(text=f'処理中... ({idx + 1}/{total_files} ファイル)')
        progress_root.update()

    compiled_data.to_excel(output_path, index=False)
    progress_root.destroy()

    messagebox.showinfo("完了", f'処理完了: {total_files}ファイルが処理されました。\n保存先: {output_path}')

if __name__ == "__main__":
    input_directory = select_directory('処理するファイルが含まれるフォルダを選択してください')
    if input_directory:
        folder_name = os.path.basename(input_directory)
        processing_date = datetime.now().strftime('%Y%m%d')
        default_name = f'データ集計_{processing_date}_{folder_name}.xlsx'
        output_path = save_file_dialog(default_name)
        if output_path:
            # ここでシート名とデータ範囲をユーザーが自由に指定できるように引数として渡す
            process_files(input_directory, output_path, '集計用', 'A:AF')

いいなと思ったら応援しよう!