openpyxl で書く Excel セルの入力規則

最も簡単なサンプル~書き方を示すもの。

from openpyxl.worksheet.datavalidation import DataValidation
dv = DataValidation(type="list", formula1='"A,B,C"')

# 適用するセルの指定
dv.add(sheet.cell(1, 1))

# シートに入力規則を登録
sheet.add_data_validation(dv)

formula1 に、文字列で指定する場合、カンマ区切りで分割できなければならない。
add_data_validation で入力規則を登録しなければならない。

シートのセルから入力規則とする場合(←もっともよくある書き方)

都道府県名のプルダウンをサンプルとして、、、

# -*- coding: UTF-8 -*-
import openpyxl
from openpyxl.worksheet.datavalidation import DataValidation

wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = 'sheet1'
fsheet = wb.create_sheet('form')

states = "北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,群馬県,栃木県,茨城県,埼玉県,千葉県," \
         "東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県," \
         "京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県," \
         "高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県"
states = states.split(",")
for i in range(len(states)):
    fsheet.cell(i+1, 2).value = states[i]

states リストを作成してこれを "form" シートの A列に1行目から書いておく。

dv = DataValidation(type="list", formula1="form!$A$1:$A$%d" % len(list))

この入力規則を、3列目、2行目と3行目に適用する場合、

dv.add(sheet.cell(2, 3))
dv.add(sheet.cell(3, 3))

これは、DataValidationオブジェクトの ranges で以下を実行するのと同等

dv.ranges = 'C2 C3'

空白文字区切りである。

大量の行を、cell(row, columns) で指定するのに、いくら forループで書けば良いといっても
それはあんまりです。
Excel の範囲の書き方を ranges で書けるらしく、
例えば、B列全てに入力を適合させる場合、Excel行の最大値=1,048,576 行から

dv.ranges = 'B1:B1048576'

と設定する。
f:id:posturan:20190310161848j:plain