【python】xlsxwriterの使い方を丁寧に

はじめに

本記事では,xlsxwriterでエクセルに数値や文字列を書き込む方法を紹介します.また,文字列の一部を色付けする,セルを結合後に書き込む,リスト形式のデータを書き込む,列の幅を調整するようなことも記載しています.

目次

xlsxwriterとは

xlsxwriterは,エクセルファイル(.xlsx)への書き込みをサポートするpythonモジュールです.指定したセルに対して,数値や文字列を書き込むことができます.他にも,一般にエクセルで動作するような式の書き込みもできます.

この記事で紹介する内容を含む公式ドキュメント:

xlsxwriter.readthedocs.io

準備

モジュールのインポート

import xlsxwriter

もしエラーが出る場合は,

pip install xlsxwriter

でモジュールをインストールします.

エクセルファイルの読み込み

.Workbook(ファイル名)でファイルを読み込みます.この後何かしら処理をしますが,最後は必ず.close()で閉じてください.閉じないと,処理が反映されません.

存在しないファイルを開こうとした場合は,自動で新規作成されます.

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
# 何かしらの処理
book.close()

シートの指定

エクセルファイルを読み込んだら,.get_worksheet_by_name(シート名)でシートを指定します.

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
sheet = book.get_worksheet_by_name('Sheet1')
book.close()

もしシートを新規作成する場合は.add_worksheet()を使います.

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
sheet = book.add_worksheet()
book.close()

値の書き込み

セルの指定方法

数値を書き込むにしろ,文字列を書き込むにしろ,書き込むセルを指定する必要があります.指定方法は2通りあるので,はじめに説明します.

  • セル名で指定する方法

    A1C5などのように,セル名を文字列として与えます.

  • 行番号,列番号で指定する方法

    0,0のように,セル名を2つの整数で与えます.最も左上のセルを0,0だと思って,二次元配列のインデックスと思えば良いです.例えば,A10,0であり,C54,2です.

何でも書き込める.write()

xlsxwriterには,各データ型に対応する書き込みメソッドが定義されています.例えば,数値を書き込むには.write_number(),文字列を書き込むには.write_string()を使います.他にも式やURLに対応するメソッドがあります.そして,これらを統合するようなメソッドとして.write()があります..write()は引数に対応する書き込みメソッドを呼んでくれるので,実質これだけ使えば事足ります.

以下のサンプルでは,数値,文字列,式を書き込んでいます.セルも2通りで指定しています.

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
sheet = book.add_worksheet()
sheet.write('A1', 5) # 数値.
sheet.write(1, 0, '5') # 文字列.(1,0)=A2
sheet.write(2, 0, "=100+10.5") # 式.(2,0)=A3
book.close()

結果は以下の通りです.同じ5でも,数値と文字列が区別されて書き込まれていることが分かります.また,式も機能していて,計算結果が表示されています.

f:id:gotutiyan:20201025003405p:plain

文字列の一部を装飾する.write_rich_string()

文字列の一部を装飾するには,.write_rich_string()を使います.これにより,太字イタリック色付けなどを混ぜて書き込めます.

.write_rich_string()は,書き込みたい文字列をカンマ区切りで3つ以上与えられます.セルの情報を含めない引数が2つ以下の場合や,空文字列を書き込もうとするとエラーになります.(空文字列の書き込みは.write_blank()という専用の関数があるので,.write_blank(),もしくは.write()で書きこむのは問題ありませんが,.write_rich_string()ではサポートしていません.)

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
sheet = book.add_worksheet()
# カンマ区切りで
sheet.write_rich_string(0, 0, 'bold', 'italic', 'color')
book.close()

ここで,.add_format()を用いて作成したフォーマット変数を,装飾したい文字列の直前に書きます.フォーマット変数は,例えば以下のように作成できます..

  • 太字:bold = book.add_format({'bold': True})

  • 斜体:italic = book.add_format({'italic': True})

  • 赤字:red = book.add_format({'color': 'red'})

このようにして作られた変数を,装飾したい文字列の直前に書きます.

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
sheet = book.add_worksheet()
bold   = book.add_format({'bold': True})
italic = book.add_format({'italic': True})
red = book.add_format({'color': 'red'})
sheet.write_rich_string(0, 0, 
                        bold, 'bold', 
                        italic, 'italic', 
                        red, 'color')
book.close()

この例では,以下のように装飾が行われます.

f:id:gotutiyan:20201025215804p:plain

フォーマットは他にもあります.以下に簡単な一覧を示します.

目的 .add_format()の中身
太字 {'bold': True}
下線 {'underline': True}
斜体 {'italic': True}
フォント指定 {'font_name': 'フォント名'}
文字サイズ {'font_size': 整数}
文字色(色名指定) {'color': 'red'}, {'color': 'blue'}など
文字色(#000000指定) {'color': '#FF0000'}, {'color': '#0000FF'}など

(上記以外にも指定できます.詳しくはこちら:https://github.com/jmcnamara/XlsxWriter/blob/master/xlsxwriter/format.py

中央揃えなどを実現するセルのフォーマット

.write_rich_string()では,引数の一番最後にフォーマット変数を与えたとき,それをセルに対するフォーマットだと認識します.例えば,中央揃えにしたいセルがあるとき,

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
sheet = book.add_worksheet()
center = book.add_format({'align': 'center'})
sheet.write_rich_string(0, 0, 'This is ', 'center ', 'string', center)
book.close()

というように,.write_rich_string()の最後にフォーマット変数を指定します.セルに対するフォーマットは,以下のようなものがあります.

目的 add_format()の中身
(横方向の)中央揃え {'align': 'center'}
左揃え {'align': 'left'}
右揃え {'align': 'right'}
セルの色(色名指定) {'bg_color': 'red'}
セルの色(#000000指定) {'bg_color': '#FF0000'}
枠線 {'border': 整数}
(縦方向の)中央揃え {'valign': 'vcenter'}
文字列を折り返して全体を表示 {'text_wrap': True}

(上記以外にも指定できます.詳しくはこちら:https://github.com/jmcnamara/XlsxWriter/blob/master/xlsxwriter/format.py

セルを結合して書き込む.merge_range()

特定の範囲のセルを結合して書き込むには,.merge_range()を使います.例えば,A1からC5までを結合して書き込む場合は,

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
sheet = book.add_worksheet()
sheet.merge_range('A1:C5', 'string') # セルを文字列で指定
# sheet.merge_range(0, 0, 4, 2, 'string') # セルをindexで指定
book.close()

と書けます.セルの情報は文字列でも整数でも指定できます.結合後のセルのフォーマットも指定できます(前述した,引数の一番最後にフォーマット変数を書く方法で).

f:id:gotutiyan:20201025215711p:plain

リストのデータを特定のセルから行/列方向に書き込む

複数のデータがリストとして存在しているとします.これを特定のセルを始点として書き込む方法です.

行方向に書き込む.write_row()

以下の例では,C2のセルから右方向にデータを書き込みます.

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
sheet = book.add_worksheet()
data = ['A', 'B', 'C']
sheet.write_row('C2', data) # セルを文字列で指定
# sheet.write_row(1, 2, data) # セルをindexで指定
book.close()

f:id:gotutiyan:20201025215536p:plain

列方向に書き込む.write_column()

以下の例では,C2のセルから下方向にデータを書き込みます.

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
sheet = book.add_worksheet()
data = ['A', 'B', 'C']
sheet.write_colmun('C2', data) # セルを文字列で指定
# sheet.write_column(1, 2, data) # セルをindexで指定
book.close()

f:id:gotutiyan:20201025215533p:plain

セルの幅を指定

.set_column()を使用して,特定の範囲のセルの幅を設定できます.以下の例では,A列からC列の幅を20ポイントに設定します.

import xlsxwriter

book = xlsxwriter.Workbook('sample.xlsx')
sheet = book.add_worksheet()
sheet.set_column('A:C', 20) # セルを文字列で指定
# sheet.set_column(0, 2, 20) # セルをindexで指定
book.close()

f:id:gotutiyan:20201025215530p:plain

おわりに

xlsxwriterを用いてエクセルファイルに値を書き込む方法を紹介しました.何かご指摘などありましたら,コメントにお願いいたします.