![見出し画像](https://assets.st-note.com/production/uploads/images/122276613/rectangle_large_type_2_1cb1bf3425be1b067a0c61a7b05f95ad.png?width=1200)
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時間くらいで完成
今後のコーディングの主流はこういう感じになっていくんだろうな。
「書ける」より「読める」ほうが大事な気がする。
ただ、作業は結局、他の方が手作業で入れてくれたようです。
勉強になったのでヨシ!
この記事が気に入ったらサポートをしてみませんか?