pythonでExcel形式のxlsxファイルを作成するのに、xlsxwriterモジュールを使わせてもらっている。とても便利で良いものだが、フォーマット関係で手こずった。具体的には、データ入力後、列単位でフォーマットを変更しようとしても、データ入力時のフォーマットが優先されてしまうこと。これは現在の仕様であるらしい。その対応のメモ。
やりたいこと
環境は以下。
- python 3.6
- xlsxwriter 0.9.8
最初に文字フォントなどを設定した状態でデータを入力し、最後に一部の列のみ幅と背景色を変更したい。
Excelで操作する感覚で考えると、たとえば以下のようなコードが最初に浮かぶ。
import xlsxwriter
book = xlsxwriter.Workbook('test.xlsx')
sheet = book.add_worksheet()
# 游ゴシック体でデータを入力
data_format = book.add_format()
data_format.set_font_name('游ゴシック')
line = [ 1, 2, 3, 4, 5]
row=0
col=0
sheet.write_row(row,col,line,data_format)
# 2列目のみ背景を赤
col_format = book.add_format()
col_format.set_bg_color('red')
sheet.set_column('B:B',30,col_format)
book.close()
このコードで期待するのは、1行目に1,2,3,4,5と游ゴシック体で入力され、B列全体が列幅30で背景色が赤になることだ。しかし、そうはならない。下図のように、列幅は適用されるが、1行目2列目の背景色が適用されない。

1行目2列目だけ赤くならない
データを入力のフォーマットが優先されるということだろうか。
仕様みたいだ
「python - Apply format to a cell after being written in XlsxWriter - Stack Overflow」にある作者さんの書き込みを見ると、どうも現行の仕様であるらしい。将来的には一気にフォーマットのみ変更するようなことにも対応したいそうなので、期待して待つにせよ、今はこの枠組みでどうにかする必要があるようだ。
となると、目的を実現するには、1行目2列目のデータ入力時は、それ以外の列とは違うフォーマットを適用してwriteするしかなさそう。色々な方法があると思うが、今回の場合は以下のコードを追記するのが簡便だろう。
# 1行目2列目に更新したcol_formatで 2 を書き込む
col_format.set_font_name('游ゴシック')
sheet.write(0,1,2,col_format)
これで目的は達せられる。

1行目2列目だけ特別
うん。当面これで。
そもそもpythonでExcelファイルをどうこうすること自体何か間違えているような気がしなくもないのだが、人とやりとりしていたらどうしてもまぁ。やっぱりみんな大好きExcelなので。
このモジュールのおかげでExcel VBAを勉強しなくて済んでいる。作者さんには感謝である。

コメント