はじめに
PythonでExcelファイルを作成するライブラリはいくつかあるが、XlsxWriterが次の理由でおすすめ。
- .xlsxファイルを出力できる
- 機能を出力のみに絞っているのでシンプルかつ強力
インストール
$ pip install xlsxwriter
基本的な使い方
公式サンプルを適当に日本語訳
こう書くと
xlsxwriter_demo.py
# 新しいファイルとワークシートを作成
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()
# 列Aの幅を変更
worksheet.set_column('A:A', 20)
# 太字にする書式を追加
bold = workbook.add_format({'bold': True})
# テキストの書き込み
worksheet.write('A1', 'Hello')
# テキストの書き込み・書式の適用
worksheet.write('A2', 'World', bold)
# 数値の書き込み(セル番地を数字で指定)
worksheet.write(2, 0, 123)
worksheet.write(3, 0, 123.456)
# 画像を挿入
worksheet.insert_image('B5', 'logo.png')
workbook.close()
こうなる
similarity matrixの作成
ここからただの個人的メモ。
- カラースケールを使ってsimilarity matrix(こういうやつ)を作りたい
- 色指定の際、最大値と最小値を自動調整したい
- 対角要素は最大値・最小値の計算から除外しないといけない
たぶんnumpy, scipy, matplotlibとか使えばできるんだろうけど、とっさに思いついたのがxlsxwriterだった。
できたソースはこんな感じ。
sim_matrix.py
# -*- coding: utf-8 -*-
import xlsxwriter
from xlsxwriter.utility import xl_rowcol_to_cell, xl_range_abs
# ワークブックとワークシートを作成
wb = xlsxwriter.Workbook("sim_matrix.xlsx")
ws = wb.add_worksheet("similarity matrix")
# データセルのサイズを設定
for i in range(5):
ws.set_row(i, 40.5)
ws.set_column(i, i, 6.0)
# データ入力
data = [[1.00, 0.15, 0.09, 0.01, 0.02],
[0.15, 1.00, 0.12, 0.06, 0.03],
[0.09, 0.12, 1.00, 0.08, 0.01],
[0.01, 0.06, 0.08, 1.00, 0.05],
[0.02, 0.03, 0.01, 0.05, 1.00]]
for i in range(5):
for j in range(5):
ws.write_number(i, j, data[i][j])
# 配列数式を使って対角要素を除く最大値・最小値を求める
data_field = xl_range_abs(0, 0, 4, 4)
ws.write_string(0, 6, "max sim")
max_formula = '{{=MAX(IF(ROW({0})=COLUMN({0}),"",{0}))}}'.format(data_field)
ws.write_formula(0, 7, max_formula)
ws.write_string(1, 6, "min sim")
min_formula = '{{=MIN(IF(ROW({0})=COLUMN({0}),"",{0}))}}'.format(data_field)
ws.write_formula(1, 7, min_formula)
# 条件付き書式を使ってカラースケールを適用
max_cell = xl_rowcol_to_cell(0, 7, row_abs=True, col_abs=True)
min_cell = xl_rowcol_to_cell(1, 7, row_abs=True, col_abs=True)
props = {
"type": "2_color_scale",
"max_color": "#FF6347", # tomato
"min_color": "#FFFFE0", # lightyellow
"max_type": "formula",
"min_type": "formula",
"max_value": max_cell,
"min_value": min_cell}
ws.conditional_format(0, 0, 4, 4, props)
# 書き込み
wb.close()
こんなファイルが出力される。