pythonを使用しExcelのすべてを更新してOutlookでメールを自動送信する
2020/09/05
Pythonを使用してExcel(エクセル)やOutlook(アウトルック)の操作をする。
今回はExcelですべてを更新をした後にOutlookでメール送信を行う自動化プログラムを紹介します。
流れとしては、SQLから吐き出されたデータをExcelで読み込んで、Excel上ですべて更新して、終わったらメールを送信するという流れ。
一応なんでこんなめんどくさい方法をとっている理由についても少し話そうと思う。
Excelを更新してOutlookでメールを送信
まず簡単にすべてのコードを紹介していき、後で詳細に説明していきましょう。
import win32com.client file_path = r'C:\Users\user\sample.xlsm' #Excelでの操作 #Excelオブジェクト生成とファイルを開く excel = win32com.client.Dispatch('Excel.Application') wb = excel.workbooks.Open(Filename=file_path) #Excelすべてを更新 wb.RefreshAll() #VBAを使用する場合下記のプログラム #wb.Application.Run('msg') #Excelファイルを保存 wb.Save() #Excelを閉じる excel.Quit() # ============================================================================= # Outlookでの操作 # ============================================================================= #Outlookオブジェクト生成とMail作成 outlook = win32com.client.Dispatch('Outlook.Application') mailCreate = outlook.CreateItem(0) #送り先のメールアドレス mailCreate.To = 'hoga@gmail.com' # 複数送る場合やBCC・CCを使う人はお使いください # mailCreate.To = "foga@co.jp; fuga@co.jp" # mailCreate.CC = "" # mailCreate.BCC = "" #mail件名と本文 mailCreate.Subject = "件名" mailCreate.Body = """ sample sample """ #添付ファイルがある場合 mailCreate.Attachments.Add(file_path) # メール送信 mailCreate.Send()
上手くいくとExcel更新後、メールが送られます。
txt,csvデータをExcelで読み込む
以前に紹介した方法になりますが、Excelでtxt,csvのファイルを取り込み・読み込むする方法を紹介しています。
Excelでtxt,csvのファイルを取り込み・読み込むする方法
上記の方法では、SQLで吐き出されたtxtやcsvをExcelファイルで読み込む際にはファイルを開いたと同時にtxtやcsvを読み込みに行く作業をしました。
しかし、Excelでファイルを開くたびに更新したくないときがあります。理由は2つ。
- 他の人がファイルをみる場合
- データ容量が多い場合
簡単に説明していきます。
他の人がファイルをみる場合
他の人がファイルをみる場合は、いろんなパターンがありますが、添付ファイルとして送る場合があります。
この場合、自身のPCのローカルストレージにtxtが保存してあり、それをExcelで読み込みにいくように設定していたとします。
そのファイルを相手方に送って確認すると、txtデータは相手のフォルダには存在していないため、読み込みにいくことができません。
開いた相手はエラーがでてしまい、相手は困惑。こういったことがないようにしたいです。
そのため、すべてを更新ボタンを押した場合のみに、txtデータを読み込みにいけるよう設定しておいたほうが良いです。
データ容量が多い場合
分析をする場合は大量のデータを分析することがあります。
エクセルではピボットテーブルを使用して分析することが多いのですが、データ容量が多い場合、計算処理に時間がかかります。
大量のデータであればあるほど、ファイルを開くのにも時間がかかり、ファイルを開いた後にも計算処理で時間がかかる。
その処理は1回だけでよければわざわざ何回もtxtデータを読み込みにいって、計算処理をしなくてもいいでしょう。
そのため、すべてを更新ボタンを押した場合のみに、txtデータを読み込みにいけるよう設定しておいたほうが良いです。
Excel(エクセル)ですべてを更新
下記のプログラムがExcelを操作するプログラムです。簡単にかけるのでわかりやすいです。
import win32com.client #Excelでの操作 #Excelオブジェクト生成とファイルを開く excel = win32com.client.Dispatch('Excel.Application') wb = excel.workbooks.Open(Filename=r'C:\Users\user\sample.xlsm') #Excelすべてを更新 wb.RefreshAll() #VBAを使用する場合下記のプログラム #wb.Application.Run('msg') #Excelファイルを保存 wb.Save() #Excelを閉じる excel.Quit()
filenameのpathはこのようにすればpathをコピーできるので自身のpathに入れ替えてください。
pythonを使用してVBA実行もできます。Excel上での複雑な処理はpythonを使用するよりもVBAを実行したほうがやりやすい。
今回はwin32comを使用していますが、Excelでの操作は他にopenpyxlでも使用できる。
VBAなどを動かしたい場合は、win32comのほうがオススメ
Excel上で簡単な操作をしたい場合は、openpyxlが情報が豊富なので知りたい方は退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミングがオススメです。
Outlook(アウトルック)でメールを送信する
Excelでの操作が完了後Outlookでメールを送信して通知が入るようにします。特にこれが使えるのが重い処理を実行した時です。
重い処理をする場合、完了までにどれぐらいかかるのかもわからないため、処理が終わるまでPCを眺めていては時間の無駄ですね。
そこで使えるのが、Outlookを使用したメール送信です。
更新したデータを添付して指定した方に送るためにOutlookが使いやすいので良いです。
もちろん、Excelの操作完了後メールで通知する仕組みとしても使えます。定期的にExcelを更新してメールを送る場合に良く使える機能なので、覚えておくと楽できます。
# ============================================================================= # Outlookでの操作 # ============================================================================= import win32com.client #Outlookオブジェクト生成とMail作成 outlook = win32com.client.Dispatch('Outlook.Application') mailCreate = outlook.CreateItem(0) #送り先のメールアドレス mailCreate.To = 'hoga@gmail.com' # 複数送る場合やBCC・CCを使う人はお使いください # mailCreate.To = "foga@co.jp; fuga@co.jp" # mailCreate.CC = "" # mailCreate.BCC = "" #mail件名と本文 mailCreate.Subject = "件名" mailCreate.Body = """ sample sample """ #添付ファイルがある場合 mailCreate.Attachments.Add('C:/Users/user/sample.xlsm') # メール送信 mailCreate.Send()
メール送信をする場合のプログラムって、SMAP接続やポート番号やパスワードなどを含めてプログラムを書かないといけない。
わかる人にとってはいいのだが、「なんだそりゃ?」ってなる人は絶対にこのプログラムがいいです。
以前Gmailをpythonを使用してメールを送るプログラムを紹介しましたが、実は上記のプログラムよりも長くなりわかりづらくなります。
pythonを使用してGmailでhtml形式メールを自動送信する方法
Outlookで操作する場合は、SMAP接続やポート番号やパスワードなどを気にせずにさらにコードも省くことができるため便利です。
ただ、Outlookでのメールを送信する場合はデフォルトアカウントでの送信になったりします。
また、GmailをOutlookで使う場合は受信メールにデータが大量にある場合、送受信に時間かかったりするため受信メールが少ないGmailを使用するのが望ましい
ちなみに、自分は過去5年分のメールが詰まったGmailを使用して送ろうとしたらいつまで経ってもメールが送られる雰囲気がなかったりしました。
もし、SMAP接続やポート番号などを含めて知りたい人は退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミングがオススメです。
この本買っておけばとりあえず業務効率化できる!!ってぐらい良書です。
まとめ
Excelでのデータ分析をやる理由ってなんだろう?と考えて一応簡単な意見を言っておきます。
pythonは分析を行うことができるツールとしては使いやすいので、pythonでやればいいと思われますが、実はブラックボックス化しやすいというデメリットも存在しています。
python上でpandasやnumpyやScikit-learnなどを使用して分析・機械学習などすることも可能なのですが、過程はプログラム作成者には把握できたとしても、全体で共有をする場合は全体の知識がある程度必要になります。
そのため、現在Excelを使用してピボットテーブルで分析をしたほうが、過程がわかるなどのメリットが存在しています。
また、pythonを使用できない会社でも、Excelは使用できるといった理由も存在しています。
ならば、Excelのファイル作成時いかに個人で楽できるのか?に焦点を合わせたほうがスムーズにやり取りはしやすいでしょう。
もちろん、相手方に中身を知られたくないときはpythonを使用してブラックボックス化していくのも手ではあります。