HEARTBEATS

PythonでExcelスプレッドシートを出力しよう

   

斎藤です。こんにちは。

今日は、Pythonの"xlutils"ライブラリを利用してExcelスプレッドシートの生成をしてみます。「使い方」「書式定義のしかた」そして「注意点」の3点について、順にお話しします。

Excelを用いて、サーバ管理台帳など、ITインフラ運用に用いるドキュメントを作られる方もいらっしゃるかと思います。そのときに、これからお話しする"xlutils"ライブラリを用いると、お手製CSV出力ツールや、それこそ 手動 で作るよりも手間を省きつつExcelスプレッドシートを作成できます。

※Python 2.7.4, xlutils 1.6.0, xlwt 0.9.2, Excel for Mac 2011 (14.3.6), Mac OS 10.7.5 を用いて検証しています

使い方

インストール

インストールはとても簡単です。

# easy_instal xlutils

インストール時、Excelファイルの書き込みを行う"xlwt"と、読み込みを行う"xlrd"が同時にインストールされます。なお、今回は"xlrd"については説明しません。

Hello, world !

プログラミング入門の定番、"Hello, world !"の出力です。

書き込みたいセルに対して、テキストを挿入します。

from xlwt import Workbook

wb = Workbook()
ws = wb.add_sheet( "First Step" )

ws.write( 0, 0, "Hello" )
ws.write( 0, 1, "World" )
ws.write( 1, 0, "Hello" )
ws.write( 1, 1, "Excel" )

wb.save( "helloworld.xls" )

プログラムを実行し、出力されたExcelファイルを開くと、次の通りの結果が得られます。

helloworld.png

Excel VBA に取り組んだ事がある方だと、書き方が似ていてしっくり来るかもしれません。

書式定義のしかた

書式を司るクラス

xlwt では、書き込むセルに対して書式を定義する事ができます。

"site-packages/xlwt/Style.py"内の"XFStyle"を用いて書式を定義し、ws.write()メソッドにてテキストを入力する際、同時に書式の情報を与える事で反映します。ここで可能なのは、Excelのセル上で右クリックしたときに出る「セルの書式設定」メニューで定義できるものとほぼ同じです。

実際は、"site-packages/xlwt/Formatting.py"内のクラスを用いて書式を定義し、XFStyle の各プロパティに反映します。次の5つのクラスがあります。

  • Font --- フォントを変更します
  • Alignment --- テキストの配置を変更します
  • Border --- 罫線を変更します
  • Pattern --- 背景を変更します (ソースのヘッダにはBackgroundとありますがクラス名はPatternです)
  • Protection --- セルの保護状態を変更します

それぞれのクラスのプロパティはAPIドキュメントを...と言いたい所なのですが、簡素なドキュメント以外見つける事ができませんでした。そのため、詳細を知るには直接ソースコードを覗く必要があります。

サンプル

# -*- coding: utf-8 -*-

from xlwt import Workbook, Font, Alignment, Borders, Pattern, Protection, Formula, XFStyle
import datetime

wb = Workbook()
ws = wb.add_sheet( "Second Step" )

# Title
font_title = Font()
font_title.name         = u"MS ゴシック"
font_title.bold         = True
font_title.colour_index = 0x35  # Orange - Style.py:L307 に定義がある
font_title.height       = 12 * 20  # 20倍するとポイントになる
ws_style_title                = XFStyle()
ws_style_title.font           = font_title
ws_style_title.num_format_str = 'yyyy-mm-dd'
ws.write( 0, 0, datetime.date.today(), ws_style_title )

# header
ws_header = [ "A", "B", "C" ]
align_header          = Alignment()
align_header.horz     = Alignment.HORZ_CENTER
borders_header        = Borders()
borders_header.left   = Borders.MEDIUM
borders_header.right  = Borders.MEDIUM
borders_header.top    = Borders.MEDIUM
borders_header.bottom = Borders.MEDIUM
pattern_header                     = Pattern()
pattern_header.pattern             = Pattern.SOLID_PATTERN
pattern_header.pattern_fore_colour = 0x16
font_header = Font()
font_header.name   = u"MS ゴシック"
font_header.height = 10 * 20  # 20倍するとポイントになる
ws_style_header           = XFStyle()
ws_style_header.alignment = align_header
ws_style_header.borders   = borders_header
ws_style_header.pattern   = pattern_header
ws_style_header.font      = font_header
for i, text in enumerate( ws_header ):
    ws.write( 1, i, text, ws_style_header )

# body
ws_data = [ [ u"A3", u"B3", u"C3" ],
            [ u"A4\nデータ", u"B4\nデータ", u"abcdefghijklmn" ],
            [ 1, 2, Formula( "A5+B5" ) ]
          ]
align_body      = Alignment()
align_body.wrap = Alignment.WRAP_AT_RIGHT
align_body.vert = Alignment.VERT_TOP
align_body.shri = Alignment.SHRINK_TO_FIT
borders_body        = Borders()
borders_body.left   = Borders.THIN
borders_body.right  = Borders.THIN
borders_body.top    = Borders.THIN
borders_body.bottom = Borders.THIN
font_body = Font()
font_body.name   = u"MS ゴシック"
font_body.height = 10 * 20
ws_style_body           = XFStyle()
ws_style_body.alignment = align_body
ws_style_body.borders   = borders_body
ws_style_body.font      = font_body
for i, row in enumerate( ws_data ):
    for j, col in enumerate( row ):
        ws.write( i + 2, j, col, ws_style_body )  # 既に2行書いているのでずらす
        # 幅
        if isinstance( col, unicode ):
            width = 300 * len( col.split( "\n", 1 )[0] )
            if width > ws.col( j ).width:
                ws.col( j ).width = width


wb.save( "format.xls" )

実行すると、次のような結果になります。

format.png

より実用的な体裁の表が出来上がりました。

注意点

使い方はソースを読みながら理解する

先にも述べましたが、"xlwt"のAPIドキュメントは非常に簡素なものです。そのため、どんなメソッド・プロパティが用意されているかは、ソースコードを覗く必要があります。また、"site-packages/xlwt/examples/"内に、開発者が用意したサンプルもあります。使い方がよくわからない時は、サンプルも参照すると良いかと思います。

変数名等がイギリス英語

変数名、メソッド名等の英単語の綴りがイギリス英語です。"colour"などが要注意です。"color"とアメリカ英語で入力するとはまる事になるので、注意してください。先の話に続きますが、変数名等はソースコードを確認して入力すると良いかと思います。

おわりに

ここまで、PythonでExcelスプレッドシートを作る"xlutils"の使い方について、「使い方」「書式定義のしかた」そして「注意点」の3点に分けて説明しました。説明中、サンプルを通じて使い方も示しました。

今回は、あらかじめ用意したデータをもとにファイルを作成しましたが、実際は自動生成をするために利用するのが主になると思います。そこで、AWSで稼働中のインスタンス一覧をboto等を経由して取得、またnoukaなどで収集したインベントリデータを取得することで、1台から数百・数千にわたる情報をスプレッドシートとしてまとめることができます。

いやはや、ドキュメント作成って辛いですよね...ささっと作り終えたいですよね...。そんな中で、"xlutils"は自社内はもちろん、お客様に納品するドキュメントの作成の手間を減らせる、よいライブラリだと思います。

それでは、ごきげんよう。

参考文献

株式会社ハートビーツの技術情報やイベント情報などをお届けする公式ブログです。



ハートビーツをフォロー

  • Twitter:HEARTBEATS
  • Facebook:HEARTBEATS
  • HATENA:HEARTBEATS
  • RSS:HEARTBEATS

殿堂入り記事