LoginSignup
7
5

More than 3 years have passed since last update.

openpyxlのごく一部備忘録

Posted at

概要

機能が多くて一覧化したほうが後々色々やりやすいってことで、列挙。
あくまでも自分で使ったもののみなのでこれで全部ではないです。
細かいところは公式を参照ください。

新しいブックを作る

ブックを作って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')
7
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5