2019年1月13日日曜日

OpenpyxlでPythonからエクセルをいじる

Openpyxlは
- 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 件のコメント:

コメントを投稿