見出し画像

ChatGPTに手伝ってもらって、Pythonのopenpyxlを使ってExcelを操作するプログラムを作った

こんにちは。高校で情報の先生をしていますTakitoです。
ご高覧いただきありがとうございます。
今回はpythonを使ってExcel操作をしてみたので書き記しておこうと思います。pythonを使ったWordやExcelの操作については、知識としてありましたが、実際に使う機会がなかったので、良い経験になりました。


きっかけ

本校では「2023年11月20日.xlsm」のようなExcelファイルを、1日の連絡として教職員全員に送信しています。詳しい理由は割愛しますが、このExcelファイルに来年度2024年4月2日まで、あと何日あるか入れたい、という話になりました。
Excelファイル自体はすでに年度当初に「2023年4月1日.xlsm」から「2024年3月31日.xlsm」まで365個のファイルを全て作成済みです。単純に考えれば、ファイルをひとつずつ開いて日数を入力することになりますが、それは少々めんどくさい。
pythonを使うとExcelファイルも操作できることだけは知っていたので、この機会にChatGPTに手伝ってもらいながら、作ってみることにしました。
ちなみに世の中がGPT-4VやらGPTsやら言っている中ですが、未だにGPT-3.5を利用しています。

ChatGPTに聞いてopenpyxlをインストール

「pythonでexcel操作したいので、ライブラリ教えてください。」

pip install openpyxl

教えてくれたopenpyxlをコマンドプロンプトからインストール。

ChatGPTに作りたいプログラムを伝える(1)

「pythonのopenpyxlを使ってプログラムを作るので手伝ってください。
 同じフォルダに保存してあるエクセルファイルを順に開いて、E1セルに
 2024年4月2日までの日数を表示したいです。エクセルファイルは、
 2024年1月1日.xlsmのように日付が名前になっています。」

import openpyxl
import os
from datetime import datetime, timedelta

# エクセルファイルが保存されているディレクトリ
directory_path = '/path/to/your/excel/files'

# ディレクトリ内のすべてのエクセルファイルを取得
excel_files = [f for f in os.listdir(directory_path) if f.endswith('.xlsm')]

# 2024年4月2日
target_date = datetime(2024, 4, 2)
   
for excel_file in excel_files:
    # ファイル名から日付を取得
    date_str = os.path.splitext(excel_file)[0]  # 拡張子を取り除く
    date_str = date_str.replace('年', '-').replace('月', '-').replace('日', '')  # 年、月、日をハイフンに置き換える

    try:
        date_object = datetime.strptime(date_str, '%Y-%m-%d')
    except ValueError as e:
        print(f"Error processing file {excel_file}: {e}")
        continue

    file_path = os.path.join(directory_path, excel_file)
    
    # 2024年4月2日までの日数を計算
    days_until_target = (target_date - date_object).days

    # エクセルファイルを開く
    wb = openpyxl.load_workbook(file_path, read_only=False, keep_vba=True)

    # アクティブなシートを取得(デフォルトでは最初のシート)
    sheet = wb.active

    # E1セルに日数を書き込む
    sheet['E1'] = days_until_target

    # エクセルファイルを保存
    wb.save(file_path)

    # ファイルを閉じる
    wb.close()

「ファイル名の日時から2024年4月2日までの」と伝え忘れたが、空気を読んでくれてほとんど完成。GPT-3.5でも充分。

ChatGPTに作りたいプログラムを伝える(2)

「すでにE1セルに文字が入っている場合はスキップすることはできますか」

    # E1セルにすでにデータが入っている場合はスキップ
    if sheet['E1'].value is not None:
        print(f"Skipping file {excel_file}: E1 cell already contains data")
        wb.close()
        continue

すでに何か記載されていたら上書きしそうだったので追加。
「#E1セルに日数を書き込む」の前に入れました。

ChatGPTに作りたいプログラムを伝える(3)

「エクセルファイルが保存されているディレクトリと、このパイソンファイルが、同じディレクトリ内にある場合、directory_pathの値はどのようになりますか」

# スクリプトが実行されているディレクトリを取得
directory_path = os.path.dirname(os.path.abspath(__file__))

# ディレクトリ内のすべてのエクセルファイルを取得する処理など...

GPTさんのおっしゃる通りに変更

作りたいpythonファイル完成

import openpyxl
import os
from datetime import datetime, timedelta

# エクセルファイルが保存されているディレクトリ
directory_path = os.path.dirname(os.path.abspath(__file__))

# ディレクトリ内のすべてのエクセルファイルを取得
excel_files = [f for f in os.listdir(directory_path) if f.endswith('.xlsm')]

# 2024年4月2日
target_date = datetime(2024, 4, 2)
   
for excel_file in excel_files:
    # ファイル名から日付を取得
    date_str = os.path.splitext(excel_file)[0]  # 拡張子を取り除く
    date_str = date_str.replace('年', '-').replace('月', '-').replace('日', '')  # 年、月、日をハイフンに置き換える


    try:
        date_object = datetime.strptime(date_str, '%Y-%m-%d')
    except ValueError as e:
        print(f"Error processing file {excel_file}: {e}")
        continue

    file_path = os.path.join(directory_path, excel_file)

    # エクセルファイルを開く
    wb = openpyxl.load_workbook(file_path, read_only=False, keep_vba=True)

    # アクティブなシートを取得(デフォルトでは最初のシート)
    sheet = wb.active

    # セルにすでにデータが入っている場合はスキップ
    if sheet['E1'].value is not None:
        print(f"Skipping file {excel_file}: E1 cell already contains data")
        wb.close()
        continue

    # 2024年4月2日までの日数を計算
    days_until_target = (target_date - date_object).days

    # セルに日数を書き込む
    sheet['E1'] = days_until_target

    # エクセルファイルを保存
    wb.save(file_path)
    print(date_object," Done")

    # ファイルを閉じる
    wb.close()

「たしかpython使えばできるはず」くらいの知識から、生成して、コードを理解して、テストして1時間くらいで完成


今後のコーディングの主流はこういう感じになっていくんだろうな。
「書ける」より「読める」ほうが大事な気がする。
ただ、作業は結局、他の方が手作業で入れてくれたようです。
勉強になったのでヨシ!

この記事が気に入ったらサポートをしてみませんか?