見出し画像

制作物#1:Pythonを使用したCSVデータのExcelへの自動インポート


1. 概要

このPythonスクリプトは、ユーザーが選択した複数のCSVファイルのデータを読み取り、指定されたExcelテンプレートに書き込んだ後、特定のフォルダに新しいExcelファイルとして保存することを目的としています。GUIを通じてファイル選択を促し、処理結果をメッセージボックスでユーザーに通知します。
本スクリプトは個人練習用として作成されたもので、動作保証はありません。

2. 要件定義

  • ライブラリとツール:

    • Python 3.x

    • ライブラリ: tkinter, pandas, openpyxl, os

    • GUIフレームワーク: tkinter(ファイル選択ダイアログと通知メッセージ表示)

  • 入力要素:

    • 複数のCSVファイル

    • Excelテンプレートファイル

    • データ保存先フォルダ

  • 処理内容:

    • 選択されたCSVファイルからのデータ読み込み

    • データをExcelテンプレートに書き込み

    • 新しいファイル名でExcelファイルを保存

  • 出力:

    • 新しく生成されたExcelファイル

    • 処理されたファイル数と保存先フォルダの情報通知

3. 利用方法

  • 環境設定:

    • 必要なライブラリをインストール: pip install pandas openpyxl

    • スクリプトを実行可能なPython環境(IDEまたはコマンドライン)

  • 実行手順:

    1. スクリプトをPython環境で実行。

    2. GUIダイアログで処理するCSVファイルを選択。

    3. Excelテンプレートファイルを選択。

    4. 処理されたデータを保存するフォルダを選択。

    5. 全ての処理が完了すると、処理されたファイル数と保存先情報がメッセージボックスで表示されます。

4.コード例1  

import tkinter as tk
from tkinter import filedialog, messagebox, simpledialog
import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
import os

def process_data():
    root = tk.Tk()
    root.withdraw()  # GUIウィンドウを非表示に設定

    # ユーザーによる複数のCSVファイルの選択
    csv_files = filedialog.askopenfilenames(title='処理するCSVファイルを選択してください', filetypes=[('CSV files', '*.csv')])
    if not csv_files:
        messagebox.showerror("エラー", "CSVファイルが選択されませんでした。")
        return

    # Excelテンプレートファイルの選択
    excel_file = filedialog.askopenfilename(title='Excelテンプレートファイルを選択してください', filetypes=[('Excel files', '*.xlsx')])
    if not excel_file:
        messagebox.showerror("エラー", "Excelファイルが選択されませんでした。")
        return

    # 処理結果の保存先フォルダの選択
    save_folder = filedialog.askdirectory(title='保存先のフォルダを選択してください')
    if not save_folder:
        messagebox.showerror("エラー", "保存先のフォルダが選択されませんでした。")
        return

    processed_files_count = 0  # 処理されたファイル数のカウント

    # 各CSVファイルに対する処理
    for csv_path in csv_files:
        df = pd.read_csv(csv_path)  # CSVファイルからデータを読み込む

        # 保存するExcelファイル名の入力
        user_filename = simpledialog.askstring("ファイル名入力", "保存するExcelファイルの名前を入力してください(拡張子除く):")
        if not user_filename:
            messagebox.showerror("エラー", "ファイル名が入力されませんでした。")
            continue  # ファイル名が入力されなかった場合、次のファイルへスキップ

        # Excelファイルの操作
        book = load_workbook(excel_file)  # Excelテンプレートファイルを読み込む
        sheet_name = 'データシート'  # 操作するシート名
        if sheet_name in book.sheetnames:
            del book[sheet_name]  # 既存のシートがあれば削除
        sheet = book.create_sheet(sheet_name)  # 新しいシートを作成

        rows = dataframe_to_rows(df, index=False, header=True)  # DataFrameをExcelシートの行に変換
        # 'rows'からデータを1行ずつ読み込み、Excelシートに追加する。
        # enumerateを使用して、各行にインデックスを付与し、インデックスは2から始まる。
        # これにより、Excelファイルのデータ挿入が2行目から開始される。
        for r_idx, row in enumerate(rows, start=2):
            sheet.append(row)

        # 新しいExcelファイルに保存
        new_excel_path = os.path.join(save_folder, f"{user_filename}.xlsx")
        book.save(new_excel_path)
        processed_files_count += 1  # 処理されたファイル数をカウントアップ

    # 処理完了の通知
    messagebox.showinfo("完了", f"全てのデータ処理が完了しました。\n処理されたファイル数: {processed_files_count}\n保存先フォルダー: {save_folder}")

if __name__ == "__main__":
    process_data()


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