Python

pythonでgoogle calendarの予定【勤怠】をエクセル形式で出力するプログラムを作る(表計算ソフト出力編)

こんにちは Tomoです。

今回は、カレンダーのデータを表計算ソフトに書き出して保存したいと思います。

事前準備

以下の準備をお願いします

  • 前回までの見直し
  • 「LibreOffice」のインストール
  • 出力用フォルダの作成

前回までの見直し

以下の内容を確認してください。


「LibreOffice」のインストール

エクセルがある場合は、エクセルでよいと思います。

エクセルがない場合は、「LibreOffice」インストールをしてください。


出力用フォルダの作成<。

出力用のフォルダを作成します。

私は、「D:\python_workspace\output_data」を作成しました。


以上準備が終わったらコーディングを行います。

ファイルを作成する

まずはファイルを作成したいと思います。ファイルの作成は、Pythonのライブラリを使います。

「openpyxl」を使います。「Anaconda」は標準でついているようです。

これまで作成したファイルを使って動かします。

    
・・・
import openpyxl

・・・略・・・

        work_book = openpyxl.Workbook()
        work_sheet = work_book.active
        work_sheet['A1'].value = 'TEST'
        file_path = 'D:\\python_workspace\\output_data\\test.xlsx'
        work_book.save(file_path)
    

最初にライブラリを使えるように「import」します。importすることでライブラリを使うことができるようになります。

次に、前回繰り返しの外側に上記3行を記載します。

1行目は、openpyxlクラスのWorkbookというメソッドで「ワークブック」のオブジェクトを作成してwork_bookの変数に格納しています。

1行目は、work_book変数のactiveというメソッドで「ワークシート」を選択して、そのオブジェクト変数に格納しています。

オブジェクトについての説明については今回省略します。(私自身使い方があいまいかもしれませんが、ご了承下さい。)

エクセル等「sheet1」「sheet2」など複数のシートが作成されると思います。work_book.activeでそのシートを画面に表示しているイメージです

3行目は、シートのÅ列の1行目に「TEST」の文字を代入しています。

4行目は出力のパスを記載しているだけです。先ほど作成したディレクトリとファイル名を「test.xlsx」を記載しています。

最後のファイルパスを指定して保存を行います。work_book.save(file_path)これは、エクセル等で名前を付けて保存と同じような動きになると思います。

実際に実行します。

    
D:\python_workspace>python testpython.py

・・・略・・・
    

実行すると事前に作成したディレクトリに「test.xlsx」が出力されていると思います。

開くとA1にTESTが記載されていると思います。

ファイルに書き込む

なんとなくですがファイルに書き込みができたので今回の前回printで出力した内容をエクセルの行単位に書き込んでいきたいと思います。

    
・・・略・・・
        work_book = openpyxl.Workbook()
        work_sheet = work_book.active

        for count, summary in enumerate(summary_list):
・・・略・・・

            work_sheet.cell(count + 1, 1).value = summary
            work_sheet.cell(count + 1, 2).value = stat_date_list[count].strftime("%Y/%m/%d")
            work_sheet.cell(count + 1, 3).value = stat_date_list[count].strftime("%H:%M")
            work_sheet.cell(count + 1, 4).value = end_date_list[count].strftime("%H:%M")
            work_sheet.cell(count + 1, 5).value = end_date_list[count] - stat_date_list[count] - datetime.timedelta(hours=1)

        file_path = 'D:\\python_workspace\\output_data\\test.xlsx'
        work_book.save(file_path)
    

work_bookとwork_sheetを繰り返しの外側に移動しました。

さっきは「A1」と指定して値を代入しましたが、今回はwork_sheet.cell(行, 列)を指定して代入します。

countは0から始まるので + 1をして1番から開始するようにしています。

[1行目、1列]=summary、[1行目、2列]=開始年月日と代入しています。

最後にファイルにファイルを指定して書き込んでいます。

では、実行します。

    
D:\python_workspace>python testpython.py

・・・略・・・
    

実行してファイルを開くと書き込みができていると思います。

まとめ

今回はエクセルファイルに書き込みまででできました。

一応ここまでで大枠の流れはできました。

カレンダーデータを読んで、データをlistに格納

listから表計算ソフトに書き込み

ソースコードが長くなったので、次回は一度ソースコードを整理したいと思います。

最後にソースコードを展開しておきます

    
import zipfile
import datetime
import dateutil.parser

with zipfile.ZipFile('D:\\python_workspace\\imput_data\\{Google アカウント}@gmail.com.ical.zip') as cal_zip:
    with cal_zip.open('{xxxxxxxx}@group.calendar.google.com.ics') as cal_file:

         jst = datetime.timezone(datetime.timedelta(hours=+9), 'JST')

         stat_date_list = []
         end_date_list  = []
         summary_list   = []

         for line in cal_file:

             line_decode = line.decode('utf-8')
             line_decode = line_decode.rstrip('\r\n')

             # イベントの開始(BEGIN:VEVENT)を探す
             if 'BEGIN:VEVENT' in line_decode:
                 print(line_decode)

             # 開始時間(DTSTART)を探す
             if 'DTSTART:' in line_decode:
                 dt_start = line_decode.split(':')
                 dt_start_time = dateutil.parser.parse(dt_start[1]).astimezone(jst)
                 stat_date_list.append(dt_start_time)
                 print(dt_start_time.strftime("%Y/%m/%d %H:%M:%S"))

             # 終了時間(DTEND)を探す
             if 'DTEND:' in line_decode:
                 dt_end = line_decode.split(":")
                 dt_end_time = dateutil.parser.parse(dt_end[1]).astimezone(jst)
                 end_date_list.append(dt_end_time)
                 print(dt_end_time.strftime("%Y/%m/%d %H:%M:%S"))

             # タイトル(SUMMARY)を探す
             if 'SUMMARY:' in line_decode:
                 summary = line_decode.split(':')
                 summary_list.append(summary[1])
                 print(summary[1])

             # イベントの終了(END:VEVENT)
             if 'END:VEVENT' in line_decode:
                 print(line_decode)
        work_book = openpyxl.Workbook()
        work_sheet = work_book.active

        for count, summary in enumerate(summary_list):
            print('----------')
            print(summary)
            print(stat_date_list[count].strftime("%Y/%m/%d"))
            print(stat_date_list[count].strftime("%H:%M"))
            print(end_date_list[count].strftime("%Y/%m/%d"))
            print(end_date_list[count].strftime("%H:%M"))
            print(end_date_list[count] - stat_date_list[count] - datetime.timedelta(hours=1))

            work_sheet.cell(count +1, 1).value = summary
            work_sheet.cell(count +1, 2).value = stat_date_list[count].strftime("%Y/%m/%d")
            work_sheet.cell(count +1, 3).value = stat_date_list[count].strftime("%H:%M")
            work_sheet.cell(count +1, 4).value = end_date_list[count].strftime("%H:%M")
            work_sheet.cell(count +1, 5).value = end_date_list[count] - stat_date_list[count] - datetime.timedelta(hours=1)

        file_path = 'D:\\python_workspace\\output_data\\test.xlsx'
        work_book.save(file_path)

    

コメント

0 件のコメント:

コメントを投稿

コメントをお待ちしています。