openpyxl モジュールで excel 操作
excel で1年間のカレンダーを作成する必要があったので、python でスクリプト書いて作成してみました。やることとしては、すでに用意されている excel テンプレートを読み込み、そのテンプレートに1月から12月のカレンダーを作成していきます。欲しい年をスクリプトに渡せば、その年のカレンダーを作成してくれるというものです。
python の excel 操作モジュール
pythonでexcel操作をする際には以下のようなモジュールがあります。
- xlrd(excel ファイルを読み込む)
- xlwt(excel ファイルに書き込む)
- xlutils(xlrd と xlwt の共通モジュール)
- openpyxl(excel2007 の読み込みと書き込みを行う)
今回はexcel2007を利用しますので、openpyxlを使います。
excel操作を行う
excelファイル読み込み〜シート指定〜セルに書き込み〜保存
# テンプレートファイルの読み込み
wb = openpyxl.load_workbook(filename = "calendar.xlsx")
# シートの読み込み
sheet = wb.worksheets[0]
# 指定したセルに書き込み
sheet["A1"].value = 10
# 保存
wb.save("calendar.xlsx")
# 別名保存(ミラーコピーしてくれます)
wb.save("calendar_2015.xlsx")
ファイル名を指定しload_workbookを呼んであげればexcelファイルを読み込めます。あとはシートとセルを指定し読み込んだり、書き込んだりできます。
カレンダーの作成
年の指定〜excel読み込み〜カレンダー作成〜保存
ということで、実際にカレンダーを作成してみました。
# -*- coding: utf-8 -*- """ create calendar """ import sys import openpyxl from datetime import date from calendar import monthrange """--------------------------------------------- main. """ def main():
# 引数で作成する年を取得 year = sys.argv[1]
youbi_dic = {6: "A", 0: "B", 1: "C", 2: "D", 3: "E", 4: "F", 5: "G"} wb = openpyxl.load_workbook(filename = "calendar.xlsx")
# 1月1シートで12月分まわす for month in range(1, 13): sheet = wb.worksheets[month] day = monthrange(int(year), int(month)) youbi = day[0] column = 2 # 月の日数分まわす for i in range(1, day[1] + 1): cell = "%s%d" % (youbi_dic[youbi], column) sheet[cell].value = i if youbi == 5: column += 1 if youbi == 6: youbi = 0 else: youbi += 1 sheets = wb.get_sheet_names() for sheet in sheets: print sheet wb.save("calendar_2015.xlsx") if __name__ == "__main__": main()
これで欲しい年のカレンダーが作成できるようになりました。