- Pythonでエクセルのような操作ができるモジュール
- 使用例: エクセルファイルを読み込んで修正して保存
注意:
- 列名は大文字にした方がよい (小文字でも大丈夫なときもある)- マージすると、「左上」のセル名が使われる
- ファイルを読み込むと、結合されていた部分の枠線が消える(左上だけ残る)
- メモリ消費はファイルサイズの50倍程度らしい(公式による)
インストール
pipかcondaでインストールできます。$ pip install openpyxl
または
$ conda install -c anaconda openpyxl
ゼロからファイルを作るとき
先にワークブックとワークシートを指定します。from openpyxl import Workbook
# make empty workbook
wb = Workbook()
ws = wb.active
既存のファイルから読み込むとき
from openpyxl import load_workbook
wb = load_workbook('test.xlsx')
ws = wb.active
保存方法
ワークブックを指定して保存します。wb.save('wb.xlsx')
セルへのアクセス
セルA1に書き込む例です。ws['A1'] = 'hello'
セルの中身を読む例です。print(ws['A1'])
このときA1をa1 と書いても出力されますが、他の場面で大文字で書かないとエラーが出るときがあるため、注意です。複数セルにアクセスするには、行、列でforループにし、1つずつにばらします。例えば
for _row in ws['A1:B4']:
for _cell in _row:
_cell.value = 'aaa'
というように行forループの中に列forループを入れます。セルをマージする
※結合セル後のセルは左上のセル名になる。ws.merge_cells('A2:D2') # A2として扱われる
マージすると罫線が消えるので、再設定します。枠線を引く
枠線はSide, Borderというモジュールを使います。セルごとに入力するのでけっこう面倒です。borderという関数を作って範囲していで同じ枠線をセットします。・線のスタイル
・上下左右のどこを対象にするか
を決める必要があります。
from openpyxl.styles.borders import Side, Border
# define line style
thin = Side(style='thin')
bold = Side(style='medium')
double = Side(style='double')
dotted = Side(style='dotted')
# border_pattern
thin_border = Border(left=thin, right=thin, top=thin, bottom=thin)
def border(ws, cells, border_pattern):
'''ws: worksheet
cells: range, like 'A1:C2'
border_pattern: like, Border(left=thin, right=thin, top=thin, bottom=thin)
'''
for _row in ws[cells]:
for _cell in _row:
_cell.border = border_pattern
で準備ができました。
border(ws, 'A1:B4', thin_border)
とすると、A1からB4の範囲で枠線が引かれます。opnepyxlでエクセルに画像を挿入する
.pyと同じディレクトリにtest.jpgを用意します。セルA1に文字を入れて、セルA2に画像test.jpgを挿入します。# py3.6
from openpyxl import Workbook
from openpyxl.drawing.image import Image
wb = Workbook()
ws = wb.active
ws['A1'] = 'You should see image below.'
img = Image('test.jpg')
ws.add_image(img, 'A2')
ws.save('add_image.xlsx')
--
参考文献
いろんなサイトを参考にさせてもらいました。
https://www.yamamanx.com/python-openpyxl-mergecell/
他いろいろ
0 件のコメント:
コメントを投稿