概要
機能が多くて一覧化したほうが後々色々やりやすいってことで、列挙。
あくまでも自分で使ったもののみなのでこれで全部ではないです。
細かいところは公式を参照ください。
新しいブックを作る
ブックを作って1つシートも作る。
以降はこれをやってある前提。
import openpyxl
book = openpyxl.Workbook()
sheet = book.active
シート名設定
sheet.name = "しーと"
ブック保存
try:
book.save("book.xlsx")
except exception as e:
# excelを開いているとPermission Error。他もあるかも。
finally:
book.close()
csvからエクセルを作る
import csv
with open("file.csv", "r") as f:
for l in csv.reader(f):
sheet.append(l)
セルに罫線を描く
この例はセルの外周に引く場合。
セル指定(num_row, num_column)はR1C1の数値(以下同様)
from openpyxl.styles.borders import Side
border = openpyxl.styles.borders.Border()
border.top = Side(style='hair', color='000000')
border.bottom = Side(style='thin', color='ff0000')
border.left = Side(style='thick', color='00ff00')
border.right = Side(style='medium', color='0000ff')
sheet.cell(row=num_row, column=num_column).border = border
colorは16進数のよくあるRGB値。
既存の罫線を保持して一部のみ変更したい場合は
border = copy(sheet.cell(row=num_row, column=num_col).border)
これで現罫線の状態を取得してから、上のやつで変更。
フォント設定
font = openpyxl.styles.fonts.Font()
font.name = 'フォント名'
font.size = 10
font.color = 'deadbeef'
# 特定セル
sheet.cell(row=num_row, column=num_col).font = font
# 値入力済範囲全体
for r in sheet:
for c in r:
sheet[c.coordinate].font = font
colorは16進数の以下略。
セル幅設定
自動で調整するのはエクセル内部機能なので使えないようです。
それっぽくするにはカラムの内容から算出するしか無いみたい。
column = openpyxl.utils.get_column_letter(num_column)
length = len(sheet.cell(row=num_row, column=num_column)
sheet.column_dimensions[column].width = length * 1.5
印刷設定
1行目を印刷タイトル、用紙向きを横、横ページ数を1、縦ページ数を無指定で印刷する場合。
sheet.print_title_rows = '1:1' # 印刷タイトル行
sheet.page_setup.orientation = 'landscape' # 縦は'portrait'
sheet.page_setup.fitToWidth = 1
sheet.page_setup.fitToHeight = 0
sheet.sheet_properties.pageSetUpPr.fitToPage = True
セル着色
塗りつぶしの場合はこれ、他のパターンも当然あります。
paint_cell.py
from openpyxl.styles.fills import (PatternFill, FILL_SOLID)
fill = PatternFill(fgColor='aabbcc', patternType=FILL_SOLID)
sheet.cell(row=num_row, column=num_column).fill = fill
fgColorは16進数(ry
セル内文字寄せ
下、中央寄せの場合。
align = openpyxl.styles.Alignment()
align.horizontal = 'center'
align.vertical = 'bottom'
sheet.cell(row=num_row, column=num_column).alignment = align
フィルタ設定
セル指定がフィルタを適用するデータの範囲であることに注意。
この場合のセル指定はA1形式。
sheet.auto_filter.ref = "B2:D10"
カラム名の数値化
R1C1用にカラム番号を取りたいときはこれ。
column_number.py
num_column = openpyxl.utils.column_index_from_string('D')