あらきけいすけのメモ帳

あらきけいすけの雑記帳2

openpyxl覚え

Workbookの新規作成、データ入力、保存

import openpyxl
workbook = openpyxl.Workbook() # 新規作成
worksheet = workbook.active # ワークシートの選択
worksheet.cell(1,1).value ='test' # データ入力 cell(行,列) 添字1から
worksheet['B2'].value ='data' # データ入力
workbook.save('./test.xlsx') # ブックの保存
workbook.close() # ブックを閉じる

既存のWorkbookを開く

keep_vba, data_only, ...
openpyxl.reader.excel module — openpyxl 3.0.9 documentation

import openpyxl
wb = openpyxl.load_workbook('./test.xlsm', data_only=True, keep_vba=True)

SUPPORTED_FORMATS = ('.xlsx', '.xlsm', '.xltx', '.xltm')*1

セルデータの読み込み

iter_rows, min_row, ...
openpyxl.worksheet.worksheet module — openpyxl 3.0.9 documentation
col_idx, column_letter, ...
openpyxl.cell.cell module — openpyxl 3.0.9 documentation

import openpyxl
wb = openpyxl.load_workbook('./test.xlsm', data_only=True, keep_vba=True)
ws = wb.active

# 全部のセルを走るループ
for row in ws: # row は cell オブジェクトの tuple
  for cell in row: 
    #行番号,列番号,列文字,データ(値,式)
    print(cell.row,cell.col_idx,cell.column_letter,cell.value)

# 全部のセルを走るループ2
for iRow in range(1,ws.max_row + 1) :
  for iCol in range(0,ws.max_column) :
    print(iRow,iCol,ws[iRow][iCol].value)

# 特定の列を読む
for row in ws.iter_rows(min_row=2): # 2行目以降のA列を読むコード
  a = row[0].value # tuple なので添え字は int
  b = row[ openpyxl.utils.column_index_from_string('A') - 1 ].value
  print(a,b)

テキストの折り返し

python - Apply 'wrap_text' to all cells using openpyxl - Stack Overflow

import copy
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active

cell = ws.cell(1,1)
algn = copy.copy(cell.alignment)
algn.wrapText = True
cell.alignment = algn
cell.value='all very long sentences should be wrapped.'

wb.save('./test.xlsx')

ws.cell(1,1).alignment.wrapText = True と書くと次のエラーを吐く:AttributeError: Style objects are immutable and cannot be changed.Reassign the style with a copy

ws['A1'].alignment = openpyxl.styles.Alignment(wrapText=True)

という書き方もある

セルのサイズの指定

ws.column_dimensions['A'].width = 80
ws.row_dimensions[1].height=90

wrapTextで自動で縦に広がったセルには「高さの情報」は付与されないようだ[2022.5.2]