IT業務効率化

Pythonでエクセルファイルを綺麗に整形する【PyExcelerate】

PyExcelerate

行に色をつけたり、セルのサイズを調整したり

  • エクセルファイルにデータをこぴぺして、幅を調整して色をつけて提出する。
  • 多部署にデータをエクセルファイルで連携しているバッチがあるが、色をつけて幅を調節して欲しいと言われてしまった。

そんな人向けの記事です。

今回はPyExcelerateというライブラリを利用します。

データは

PyExcelerate 使ってみた
Python to excelを高速化するPyExcelerateを使ってみたはじめに 普段Pythonで大量データをエクセルに出力するシステムを扱っています。 しかしデータが大きいと中々時間が掛かってしま...

と同じものを利用してますが、ご自身の利用しているデータでも試すことは可能です。

Pythonでエクセルを調整してみる

任意のセルに色をつける

驚いたのはセルを範囲で指定できることです。(詳細)下のコードはREADMEに上がっていたコードです。

from pyexcelerate import Workbook, Color
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("test")
ws.range("A1","C3").value = 1
ws.range("A1","C1").style.font.bold = True
ws.range("A2","C3").style.font.italic = True
ws.range("A3","C3").style.fill.background = Color(255, 0, 0, 0)
ws.range("C1","C3").style.font.strikethrough = True

早速例に倣って、ヘッダーをに色をつけようと思います。

%%time
sample_csv_df = pd.read_csv("50000_Sales_Records.csv")
rownum = len(sample_csv_df.index)
colnum = len(sample_csv_df.columns)

first_cell = "B2"
end_cell = get_column_letter(colnum+1) + str(rownum+1)
header_range = (first_cell, get_column_letter(colnum+1) + str(2))


wb = Workbook()
ws = wb.new_sheet("a test sheet")
ws.range(first_cell, end_cell).value = sample_csv_df.values.tolist()
ws.range(header_range[0], header_range[1]).style.fill.background = Color(18, 80, 44, 0)
wb.save("pyexcelerate_output.xlsx") 

実行結果が下の画像です。成功です。

python excel

列の幅を調節する

READMEをみると、列の調節もあるようです。

ws.set_col_style(2, Style(size=0))

こんな感じで列番号とサイズを入力するだけでいいそうです。では早速サイズを・・・

-1 for auto-fit

-1で自動調整してくれる?これは他のライブラリにはない超画期的機能なのでは?

では上の1行だけコードを増やして実行してみます。結果は下の画像。

python excel

うおおおおお、すごい!!これはすごい!!

私の探した限り他のエクセル用pythonライブラリにはない機能です。

任意のセルから出力する(おまけ)

おまけにしたのは、どうもベストプラクティスがわからなかったからです。

申し訳ない

最初の列と行には余白を入れたいので、B2セルから始めたいと思います。

READMEにはこのように例が書かれていました。

from pyexcelerate import Workbook

wb = Workbook()
ws = wb.new_sheet("test")
ws.range("B2", "C3").value = [[1 , 2], [3, 4]]
wb.save("output.xlsx")

 

末尾のセル(例ではC3)を入れる必要があるので面倒ですね。なしで行けるのかやってみます。

えいや

sample_csv_df = pd.read_csv("50000_Sales_Records.csv")

wb = Workbook()
ws = wb.new_sheet("a test sheet")
ws.range("B2").value = sample_csv_df.values.tolist()
wb.save("pyexcelerate_output.xlsx")

 

TypeError: range() missing 1 required positional argument: ‘end’

はい、ダメでした。

調べたところ空っぽの列を挿入するというメソッドはPyExcelerateにはなさそうです。

そのためだけにopenpyxlで読み直すのも面倒なので、末尾に相当するセルを取得することにしますopenpyxl.utils.cell.get_column_letterを利用します。

example, get_column_letter(3) -> C

のように、エクセルのn列目のアルファベットを返してくれます。

from openpyxl.utils.cell import get_column_letter
sample_csv_df = pd.read_csv("50000_Sales_Records.csv")
rownum = len(sample_csv_df.index)
colnum = len(sample_csv_df.columns)
first_cell = "B2"
end_cell = get_column_letter(colnum+1) + str(rownum+1)

wb = Workbook()
ws = wb.new_sheet("a test sheet")
ws.range(first_cell, end_cell).value = sample_csv_df.values.tolist()
wb.save("pyexcelerate_output.xlsx")

 

この書き方をすると時間はこのくらいでした。

おわりに

本記事は

PyExcelerate 使ってみた
Python to excelを高速化するPyExcelerateを使ってみたはじめに 普段Pythonで大量データをエクセルに出力するシステムを扱っています。 しかしデータが大きいと中々時間が掛かってしま...

の記事の作成中に副産物として生まれました。よければこちらもご覧ください。

また業務自動化に関して大切と思えることをまとめました。合わせてぜひご覧ください。

python 自動化の課題
Pythonで業務自動化においてコードよりも大切なこと退屈なことをPythonにやらせてみて気づいたコードより大切なこと こちらの有名なPythonの本があるように、たくさんことが...
ABOUT ME
hirayuki
今年で社会人3年目になります。 日々体当たりで仕事を覚えています。 テーマはIT・教育です。 少しでも技術に親しんでもらえるよう、noteで4コマ漫画も書いています。 https://note.mu/hirayuki