[最終更新] 2017年11月20日
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列目の背景色が適用されない。

データを入力のフォーマットが優先されるということだろうか。
仕様みたいだ
「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)
これで目的は達せられる。

うん。当面これで。
そもそもpythonでExcelファイルをどうこうすること自体何か間違えているような気がしなくもないのだが、人とやりとりしていたらどうしてもまぁ。やっぱりみんな大好きExcelなので。
このモジュールのおかげでExcel VBAを勉強しなくて済んでいる。作者さんには感謝である。
関連記事
Python の記事
- [2018年1月9日] pythonで画像をダウンロードして、URLに応じてディレクトリ分けする
- [2017年12月27日] Pandasで行の追加(縦方向の連結)の操作メモ
- [2017年12月25日] PDFから文章を抽出する
- [2017年12月25日] seleniumのGoogle検索で最初にヒットしたサイトのスクリーンショットを撮る
- [2017年12月22日] pythonでExcelファイル内の半角をすべて全角にする
- ---本記事---
- [2016年10月22日] pythonのPyYAMLでブロック形式で書き込み(dump出力)
- [2016年10月4日] 旧版:とにかくRaspberry Piにpython3 + numpy + matplotlibをインストールする(pyenv使用)
- [2016年8月3日] Python3で意図せずしてfloatに…VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
- [2015年12月17日] matplotlib も十分わかりやすく思えてしまう
- [2015年9月16日] Python でクロスプラットフォームの排他ロックはなかなか難しく
スポンサーリンク