openpyxl モジュールで excel 操作

excel で1年間のカレンダーを作成する必要があったので、pythonスクリプト書いて作成してみました。やることとしては、すでに用意されている excel テンプレートを読み込み、そのテンプレートに1月から12月のカレンダーを作成していきます。欲しい年をスクリプトに渡せば、その年のカレンダーを作成してくれるというものです。

pythonexcel 操作モジュール

pythonexcel操作をする際には以下のようなモジュールがあります。

  • 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()

これで欲しい年のカレンダーが作成できるようになりました。