ネ申エクセル(別名エクセル方眼紙)と付き合うことが激増してきた。
from os import chdir
from pathlib import Path
import xlwings as xw
xw.App() if len(xw.apps) == 0 else None # Excelが開いてなければ開いておく
#%% ディレクトリ直下の複数ファイルを処理する場合
chdir("some-directry")
folder = Path("./")
files = [x for x in folder.iterdir() if x.is_file() and "xlsx" in x.name]
for file in files:
wb = xw.books.open(file)
# 他のブックを閉じる
# 最後のブックを閉じるとアプリは終了せず制御ができなくなるため一つは残す
[x.close() for x in xw.books if x != wb]
# シートを指定する
ws = wb.sheets[0]
# 名前で指定しても良い
# ws = wb.sheets["Sheet1"]
#%% 読み取り・書き込み
# single cell
ws[0,0].value = "A1"
# trivial
ws[0,0] == ws.range(1,1) == ws.range("A1")
# multiple cells
ws.range("A1:D10").value = "Foo"
# another way
row0,col0 = ws.range("A1").row, ws.range("A1").column
row1,col1 = ws.range("D10").row, ws.range("D10").column
ws.range((row0,col0), (row1, col1)).value = "Bar"
#%% セルの状態
# is merged?
ws.range("A1").merge_cells
# >>> True or False
# cell color
ws.range('A1').color = (120,120,255)
ws.range('A1').color = None
# '#{:02x}{:02x}{:02x}'.format(r, g, b) rgb to hex
#%% 数値
# 数値が文字列として保存されている場合等には注意を要する
# またFloatの仕様も意識する必要がある
A1 = ws.range("A1").value = 1.6
A2 = ws.range("A2").value = 0.1
ws.range("A3").value = A1 + A2 # A3 -> 1.6 + 0.1
ws.range("A3").value == 1.7 # False
ws.range("A3").value # --> 1.7000000000000002
# Decimalを使用するとよい
from decimal import Decimal,ROUND_CEILING
A1 = ws.range("A1").value = 1.6
A2 = ws.range("A2").value = 0.1
A3 = Decimal(str(A1)) + Decimal(str(A2))
# これはダメ
# Decimal(A1) + Decimal(A2)
# >>> Decimal('1.700000000000000094368957093')
# 桁数を保持したい場合には文字列で保存するのが手っ取り早い(スマートではないけど)
ws.range("A3").value = "'" + str(A3.quantize(Decimal('1.00'),rounding=ROUND_CEILING))
ネ申エクセル最高!
んな訳あるか!!
でもW〇rdや、P〇werP〇intよりプログラマブルな点マシか。