Python3 openpyxlを使ってExcel(xlsx)ファイルに値や画像を出力する

プログラミング Python3
Photo by Clément H on Unsplash

 Python3を使った画像や値の書き出し方を紹介します。私自身の備忘録も兼ねて詳細な解説よりも、できるだけ簡単に(コピペだけで)目的が達成できるように書いていきます。

1.必要なライブラリ

Excel2007以降のバージョンのファイル(.xlsx)を出力するにはopenpyxlを使用します。
※2007より前のバージョン(.xls)を出力する場合はxlrd, xlwtなどを使用します。
openpyxlを使って画像の操作(圧縮、挿入)などを行う場合はPillow がさらに必要です。

今回は二つのライブラリをインストールします。

 > pip install openpyxl Pillow

openpyxl公式ドキュメント:

https://openpyxl.readthedocs.io/en/stable/index.html

2.ファイルを新規作成、開く、保存する

ファイルを新規作成する場合はWorkbook()を使い、既存のファイルを開く場合は、load_workbook()を使います。
保存する際は、save()に保存場所、ファイル名を指定します。

ファイルを新規作成する場合:opnepyxl.Workbook()
ファイルを保存:workbook.save(excelFilePath)

import openpyxl

#Workbookの"W"は大文字
wb = openpyxl.Workbook()
#~略~
filePath = "D\\etc\\user\\test.xlsx"
wb.save(filePath) 

既存のファイルを開く:openpyxl.load_workbook( excelFilePath)
ファイルを保存:workbook.save(excelFilePath)

import openpyxl

filePath = "D:\\etc\\user\\test.xlsx"

#load_workbook()はすべて小文字
wb = openpyxl.load_workbook(filePath)
#~略~
wb.save(filePath) 

3.セルの値の読み書き

ws.cell(row = r_index , column = c_index ).value を使い値を読み書きします。この場合、数式を読み取るため計算結果が欲しい場合は、load_workbookの引数にdata_only=Trueを追記します。
新規作成し保存していないファイルの計算結果は読み取れないようです。

import openpyxl

filePath = "D:\\etc\\user\\test.xlsx"

#load_workbook()はすべて小文字、計算結果が欲しい場合は引数に data_only=Trueを付加する
wb = openpyxl.load_workbook(filePath)
ws = wb.active

#セルA1に'test'という文字列を入力
ws.cell(row = 1, column = 1).value = 'test'
#セルB1にA1の値を入力
ws.cell(row = 2, column = 1).value = ws.cell(row = 1, column = 1).value

filePath = "D\\etc\\user\\test.xlsx"
wb.save(filePath) 

worksheetオブジェクトはアクティブなシート以外にも名称やインデックスNo.でも取得できます。

#Sheet1という名称のシートを取得
ws = wb['Sheet1']

#シートのindexが0番目のシートを取得
ws = wb.worksheets[0]

#アクティブなシートを取得
ws = wb.active
4.セルに画像を張り付ける

画像を挿入してもセルの大きさは変わらないため、カタログのようなシートを作りたい場合は画像を一定の大きさに揃え、セルの大きさを適宜変更する必要があります。

import openpyxl

wb = openpyxl.Workbook()
#アクティブなworksheetオブジェクトを取得
ws = wb.active 

#貼り付けたいセルの大きさを設定。列は'A'~の英数表記で、行は数値での表記
#設定値の単位は"pt"を使う。
ws.column_dimensions['B'].width =30
ws.row_dimensions[2].height =108

img_file_path = "D:\\etc\\usr\\test.jpg"
img = openpyxl.drawing.image.Image(img_file_path)

#画像のサイズの単位はpixcelで指定する。今回は180pxとする。
#縦横比一定としてサイズ調整後、画像を張り付ける。
MAX_SIZE = 180
ratio = 0
if img.height > img.width :
    ratio = MAX_SIZE / img.height
else :
    ratio = MAX_SIZE / img.width
img.height = ratio * img.height
img.width = ratio * img.width
#imageの引数はimgオブジェクトと挿入場所。"A1"形式で書く必要がある。
ws.add_image(img, 'B2')
wb.save(filePath)

コメント

タイトルとURLをコピーしました