PythonでExcelを操作する方法|openpyxlでExcel操作

PythonでExcelを操作する方法 Python
PythonでExcelを操作する方法
この記事は約44分で読めます。

はじめに

PythonでExcelファイルの書き込みやワークシートの追加などの操作を行うには、openpyxlを使うことをオススメします。

今までExcelマクロで行っていた様々な処理は、Pythonのopenpyxlを使用することでコード量が少なくなり、見た目(可読性)も綺麗になります。

Pythonはプログラムを開発する上で非常に取っ付きやすい(書きやすい)ですし、他の人がコードを見ても理解しやすい言語です。

Excelを操作する方法のひとつとして、Pythonのopenpyxlを身につけるとスキルの幅が広がるので、いろいろ試してみる価値はあると思います。

それでは、PythonでExcelを操作する方法について、ご紹介していきます。

PythonでExcelを操作するにあたって

Excelファイルは、ブックワークシートセルという基本構造になっており、Pythonを使ってExcelファイルを操作するときには、この基本構造を意識する必要があります。

PythonでExcelを操作するには、まずブックにアクセス(読み込み)します。

そして、ワークシートにアクセスし、セルにアクセスする、という流れですね。

勇者レベル2
勇者レベル2

いきなりセルにアクセスしないでね、ということですね。

openpyxlについて

openpyxlはPythonからExcelファイル(.xlsx)を操作する上で、非常に便利なライブラリです。

例えば、次のような処理を行うことができます。

  • Excelファイル(ブック)の新規作成
  • Excelファイル(ブック)の読み込み、書き込み
  • Excelファイル(ブック)の削除
  • Excelファイル(ブック)の上書き保存、別名保存
  • Excelシートの追加、削除、読み込み、書き込み
  • 書式の変更
  • セルの操作
  • 画像やグラフ等の挿入

などなど。

機能が豊富なので、気になる方は個別に調べてみてください。

openpyxlのインストール方法

openpyxlをインストールするには、以下のようにpipでインストールします。

pip install openpyxl

念のため、次のコマンドを入力し詳細表示されることを確認します。

pip show openpyxl

openpyxlの読み込み方法

プログラム内でopenpyxlを使用するには、以下のようにimport文でopenpyxlを読み込みます。

import openpyxl

読み込みエラーにならなければ、これでプログラム内でopenpyxlが使用可能となります。

import文でopenpyxlの読み込みができたら、試しに任意のExcelファイルを読み込んでワークシート名を出力してみましょう。

import openpyxl

# ブックの読み込み
wb = openpyxl.load_workbook("sample.xlsx")

# ブック内の全シートを出力
print(wb.sheetnames)

問題なく、Excelシート名が出力されたと思います。

その他の操作方法についても、これからご紹介していきますね。

Excelファイル(ブック)の操作方法

Excelファイル、つまりブックの操作を行う方法について、見ていきたいと思います。

上記でも少し触れましたが、ブックの操作はExcelファイルの新規作成、読み込み、書き込み、保存(上書き保存、別名保存、別フォルダへ保存)、削除などがありますので、基本的な形から覚えていきましょう。

Excelファイルの新規作成

Excelファイルを新規に作成するには、次のように記述します。

# 基本的な形
# ブックを新規作成
wb = openpyxl.Workbook()

# 名前を指定して保存
wb.save("保存したいExcelファイル名")

でわ、実際に試してみましょう。

「sample01.xlsx」というExcelファイルを新規に作成してみます。

import openpyxl

# ブックを新規作成
wb = openpyxl.Workbook()

# 名前を指定して保存
wb.save("sample01.xlsx")

実質、たった数行ですね。

実行したらエクスプローラーで確認してみましょう。

openpyxlでフォルダを新規作成

Pythonプログラムと同じ階層に、Excelファイルが新規作成されました。

ラスボス
ラスボス

単純に空のExcelファイルを作成したいだけなのであれば、上記のように数行で終わります。

勇者レベル2
勇者レベル2

すごく簡単ですね。

ラスボス
ラスボス

もし、違うフォルダに保存したい場合は、wb.save()に保存先のPath(相対Path、絶対Path)を含めた形で指定してあげましょう。

Excelファイルの読み込み

Excelファイルを読み込むには、以下のように「openpyxl.load_workbook()」を使います。

# 基本的な形
変数名 = openpyxl.load_workbook("Excelファイル名")

Excelファイルを読み込むサンプルは、以下になります。

import openpyxl

# ブックの読み込み
wb = openpyxl.load_workbook("sample01.xlsx")

Excelファイル名の指定は、拡張子まで書きましょう。

※別フォルダに保存してあるExcelファイルを読み込みたい場合は、Pathを含めた形で記述してください。

load_workbook()で指定したExcelファイルを読み込み、戻り値を変数「wb」に格納している、ということですね。

試しにwb変数の中身を確認してみますと、

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")
print(wb)

# 実行結果
<openpyxl.workbook.workbook.Workbook object at 0x000001AA744A39D0>

ワークブックのオブジェクト (ブックオブジェクト) が取得できていますね。

ブックオブジェクトが取得できましたので、これからExcelファイルに対する様々な操作が可能になります。

Excelファイルの書き込み

それでは、Excelファイルにデータを書き込んでみましょう。

データの書き込みに関しては、シート名やセルの指定などが必要なので、説明するにあたっては後ろの方がいいかなと思ったのですが、説明箇所へのリンクも貼りましたので先にそちらを見ていただいてもOKです。

Excelファイルにデータを書き込む、基本的な流れは以下になります。

  1. load_workbook()で、Excelファイルを読み込みます(ブックオブジェクトの取得)。
  2. シート名を指定します。
  3. セルを指定します。
  4. データを書き込みます。
  5. 最後に、wb.save()でExcelファイルを保存します。

※今回は「wb = openpyxl.load_workbook(“Excelファイル名”)」を使用し、戻り値であるブックオブジェクトを変数「wb」に格納しています。

もし、別変数名を使いたい場合は、適宜読み替えてください。

Excelファイルの上書き保存

Excelファイルを上書き保存したい場合は、次のように記述します。

# 基本的な形
import openpyxl

# ブックの読み込み
wb = openpyxl.load_workbook("Excelファイル名")

# 上書き保存
wb.save("同じExcelファイル名")

「wb.save()」の箇所で、引数に同じExcelファイル名を指定してあげれば、上書き保存されます。

次のコードは、Excelファイルを上書き保存するサンプルです。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# 上書き保存
wb.save("sample01.xlsx")

Excelファイルのタイムスタンプが更新されたことを、確認してみましょう。

Excelファイルを別名で保存

Excelファイルを別名で保存したい場合は、次のように記述します。

# 基本的な形
import openpyxl

# ブックの読み込み
wb = openpyxl.load_workbook("Excelファイル名")

# 別名で保存
wb.save("別のExcelファイル名")

「wb.save()」の箇所で、引数に別のExcelファイル名を指定してあげれば、別名のファイルとして保存されます。

次のコードは、Excelファイルを別名ファイルとして保存するサンプルです。

import openpyxl

# ブックの読み込み
wb = openpyxl.load_workbook("sample01.xlsx")

# 別名で保存
wb.save("mytask.xlsx")

下記のとおり、別名のファイル(mytask.xlsx)が無事、作成されました。

openpyxlでExcelファイルを別名保存

保存時に別のファイル名を指定してあげれば、上記のように別名で保存されます。

保存先はPythonファイルと同じ場所(階層)になりますので、保存先を変更したい、つまり別フォルダに保存したい場合について、これからご説明します。

Excelファイル保存時に、別フォルダを指定して保存

Excelファイルを保存する際、もし保存先のフォルダが存在しない場合はエラーになってしまいます。

そういったエラーを回避する方法として、次のように指定したフォルダが存在しない場合は、自動で新規フォルダを作成する処理を入れておきましょう。

# 基本的な形
from pathlib import Path
Path("保存先フォルダ名").mkdir(exist_ok=True)

保存先として指定したフォルダが存在するのであれば何もせず、存在しない場合は新規に作成する処理になります。

上記は、Pythonファイルと同じフォルダ内に、新規フォルダを作成する形です。

別の場所(階層)に保存したい場合は、フォルダのPathを指定してください。

では、上記処理を含めたExcelファイルを別フォルダに保存したい場合は、次のように記述します。

import openpyxl
from pathlib import Path

# ワークブックの読み込み
wb = openpyxl.load_workbook("sample01.xlsx")

# フォルダがなければ新規作成
Path("test_dir").mkdir(exist_ok=True)

# 別フォルダにファイルを保存
wb.save("test_dir/sample01.xlsx")

以下のように、無事新規フォルダが作成されました。

openpyxlで新規フォルダを作成

また、フォルダ内にもExcelファイルが保存されたことを確認できました。

openpyxlで別フォルダに保存

Excelファイルの削除

Excelファイルを削除したい場合は、単純にPythonのosライブラリで削除します。

import os

# ファイルの削除
os.remove("test.xlsx")

単純ですね。

プログラムで処理を進めていくうちに不要となったExcelファイルは、os.remove()でサクッと削除しましょう。

ExcelファイルがファイルサーバやNASに保存されている場合

Excelファイルがローカル(ご自身のパソコン)にある場合は、これまでにご説明した内容でいいのですが、会社の場合だとファイルサーバやNASに保存されているケースがあると思います。

その際は、Excelファイルを指定する箇所にファイルサーバやNASに保存されているExcelファイルのフルパス(絶対Path)を指定しましょう。

Excelファイル(ワークシート)の操作方法

ワークシートを操作する方法は、いくつかあります。

シート名を指定する方法、アクティブ(最後に使用したシート)なシートを指定する方法、インデックス番号で指定する方法など。

ご自身の使いやすいやり方でいいと思いますが、処理の内容的に効率が良いものを適宜、使い分けられたらいいと思います。

まずは、単純にExcelシート名を取得する方法を見ていきたいと思います。

このページではサンプルコードを載せていますが、出力されるシート名等はあくまでサンプルになります。

Excelシートの新規追加

新しいシートを追加したい場合は、シートの追加場所を先頭にするのか末尾にするのか、それとも任意の場所(インデックス番号)にするのかを考慮しましょう。

先頭にシートを追加する方法から見ていきたいと思います。

先頭にシートを追加する

先頭にシートを追加するには、次のように記述します。

# 基本的な形
wb = openpyxl.load_workbook("Excelファイル名")
ws = wb.create_sheet(index=0)

index=0」にすると、先頭にシートが追加されます。

サンプルコードは、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# 先頭にシートを追加
ws = wb.create_sheet(index=0)
print(ws.title)

# 上書き保存
wb.save("sample01.xlsx")

# 実行結果
Sheet3

実際にExcelファイルを開いて、先頭にシートが追加されたことを確認してみましょう。

末尾にシートを追加する

末尾にシートを追加するには、次のように記述します。

# 基本的な形
wb = openpyxl.load_workbook("Excelファイル名")

# 末尾にシートを追加
ws = wb.create_sheet()

wb.create_sheet()」の引数が空であれば、末尾にシートが挿入されます。

サンプルコードは以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# 末尾にシートを追加
ws = wb.create_sheet()

# 追加したシート名を出力
print(ws.title)

# 上書き保存
wb.save("sample01.xlsx")

# 実行結果
Sheet4

「Sheet4」というシートが、末尾に挿入されました。

任意の場所にシートを追加する(インデックス番号指定)

任意の場所にシートを追加したい場合は、次のように記述します。

# 基本的な形
wb = openpyxl.load_workbook("Excelファイル名")

# 任意の場所にシートを追加
ws = wb.create_sheet(index=任意の数字)

index=」の箇所に、左から何番目の位置にシートを挿入したいのかを指定します。

注意点として、インデックス番号は「0」番からになります。

サンプルコードは、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# 左から2番目に追加
ws = wb.create_sheet(index=1)
print(ws.title)

# 上書き保存
wb.save("sample01.xlsx")

# 実行結果
Sheet5

実際にExcelファイルを開いて、確認してみましょう。

Excelシート名の確認

シート名を確認するには、次のように記述します。

# シート名の確認
print(シートの変数.title)

サンプルコードは、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# 末尾にシートを追加
ws = wb.create_sheet()

# 追加したシート名を出力
print(ws.title)

# 実行結果
Sheet6

末尾に追加したシート名の確認ができました。

Excelの全シート名を取得

これから読み込むExcelファイルには、どんなシートが保存されているのか、気になる時があります。

そんなときは、読み込むExcelファイルの全シート名を取得してみましょう。

次のように記述します。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# 全シート名を出力
print(wb.sheetnames)

# 出力結果
['Sheet', 'Sheet1', 'Sheet2']

Excelファイルに含まれている全シート名を取得することができました。

数シートしか存在しないようなExcelファイルなら、実際にファイルを開けばいいのですが、数十シートも存在するようなファイルの場合は、上記のように一瞬でシート名を出力させる方が、把握しやすいと思います。

シート数が多いファイルだと、威力を発揮しますね。

Excelシートの選択

Excelファイル(ブック)を読み込んだ後、シートを選択する方法はいくつかあります。

ひとつずつ、見ていきましょう。

シート名を指定する方法

複数存在するシートのうち、特定のシート名を指定する場合は、次のように記述します。

# 基本的な形
wb = openpyxl.load_workbook("Excelファイル名")

# シート名を指定
ws = wb["シート名"]

でわ、実際にコードを実行してみましょう。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# シート名を指定
ws = wb["Sheet1"]
print(ws)

# 出力結果
<Worksheet "Sheet1">

シート名「Sheet1」が出力されました。

シート名を指定できたら、次は「Sheet1」のセルのデータを読み込んだり、書き込んだり、自由に処理を追加することが可能ですね。

アクティブなシートを指定する方法

アクティブなシートを指定したい場合は、次のように記述します。

# 基本的な形
wb = openpyxl.load_workbook("Excelファイル名")

# アクティブなシートを指定
ws = wb.active

サンプルコードは、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# アクティブなシートを指定
ws = wb.active
print(ws)

# 実行結果
<Worksheet "Sheet1">

アクティブなシートを指定することができました。

注意点としては、最後にファイルを閉じたときにアクティブになっていたシート名ではなく、最後にファイルを保存したときにアクティブになっていたシート名が取得されます。

いつも使うシートが同じなのであれば、このやり方がよさそうですね。

(先頭から)何番目のシートを指定する方法

シート名を指定するより、「先頭(一番左)から何番目のシートを使いたい」という場合は、インデックス番号を指定する方法がよいと思います。

インデックス番号でシートを指定する方法は、次のように記述します。

# 基本的な形
wb = openpyxl.load_workbook(“Excelファイル名”)

# インデックス番号でシートを指定
ws = wb.worksheets[インデックス番号]

インデックス番号は、「0」番(一番左のシート)から数えますのでご注意ください。

サンプルコードは、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# 先頭(一番左)のシート名を指定
ws = wb.worksheets[0]
print(ws)

# 2番目のシート名を指定
ws = wb.worksheets[1]
print(ws)

# 3番目のシート名を指定
ws = wb.worksheets[2]
print(ws)

# 実行結果
<Worksheet "Sheet">
<Worksheet "Sheet1">
<Worksheet "Sheet2">

インデックス番号を指定して、問題なくシート名を指定することができました。

Excelシート名を変更する

シート名を変更したい場合は、「シートの変数.title = “新しいシート名”」のように記述します。

基本的な形は、以下になります。

# 基本的な形
wb = openpyxl.load_workbook("Excelファイル名")

# シートを指定
ws = wb["シート名"]

# シート名(タイトル)を変更
ws.title = "今月の売上データ"

# 上書き保存
wb.save(" 同じExcelファイル名 ")

サンプルコードは、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# シート名を指定
ws = wb["Sheet"]

# シート名(タイトル)を変更
ws.title = "今月の売上データ"

# 上書き保存
wb.save("sample01.xlsx")

実際にExcelファイルを開いて、シート名が変更されたことを確認しましょう。

Excelシートのコピー

シートをコピーしたい場合は、「ブックの変数.copy_worksheet(シートの変数)」を使います。

末尾にコピーする方法や、先頭、任意の場所にコピーする方法がありますので、ひとつずつ見ていきましょう。

コピーしたシートを末尾に挿入(追加)する

コピーしたシートを末尾に挿入したい場合は、次のように記述します。

# 基本的な形
# コピーするシートを指定
ws = wb["シート名"]

# シートをコピー
ws_copy = wb.copy_worksheet(ws)

# シート名を変更したい場合は、適宜変更します
ws_copy.title = "新しいシート名"

# 上書き保存
wb.save("Excelファイル名")

上書き保存することを忘れないようにしましょう。

サンプルコードは、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample03.xlsx")

# 一旦、全シート名を確認
print(wb.sheetnames)

# コピーするシートを指定
ws = wb["Sheet"]

# シートをコピー
ws_copy = wb.copy_worksheet(ws)

# シート名の変更
ws_copy.title = "今月のへそくりメモ"

# 上書き保存
wb.save("sample03.xlsx")

# 全シート名を確認
print(wb.sheetnames)

# 実行結果
['Sheet', 'Sheet1', 'Sheet2', 'Sheet3']
['Sheet', 'Sheet1', 'Sheet2', 'Sheet3', '今月のへそくりメモ']

上記のprint文でもわかりますが、Excelファイルを開くとシートの末尾に「今月のへそくりメモ」シートが挿入されていることが確認できます。

簡単ですね。

コピーしたシートを先頭に挿入(追加)する

コピーしたシートを先頭に挿入するには、まず対象となるシートをコピーした後、ブックの変数.move_sheet()で任意の場所を指定します。

# 基本的な形
wb.move_sheet(シートの変数, offset=数字)

offset値で、コピーしたシートをどの位置に挿入するか指定します。

マイナスの数字はシートの左側を、プラスの数字はシートの右側を表します。

たとえば、先ほどシートの末尾にコピーした「今月のへそくりメモ」シートをコピーし、先頭に挿入したい場合は以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample03.xlsx")

# 一旦、全シート名を確認
print(wb.sheetnames)

# コピーするシートを指定
ws = wb["今月のへそくりメモ"]

# シートをコピー
ws_copy = wb.copy_worksheet(ws)

# シートの先頭に挿入
wb.move_sheet(ws_copy, offset=-5)

# 上書き保存
wb.save("sample03.xlsx")

# 全シート名を確認
print(wb.sheetnames)

# 実行結果
['Sheet', 'Sheet1', 'Sheet2', 'Sheet3', '今月のへそくりメモ']
['今月のへそくりメモ Copy', 'Sheet', 'Sheet1', 'Sheet2', 'Sheet3', '今月のへそくりメモ']

コピーしたシートが、先頭に挿入されましたね。

今回はコピーしたシートのタイトルを特に指定しなかったので、「Copy」が付与された形になります。

繰り返しになりますが、offset値はマイナスを指定するとシートの左側を、プラスの数字を指定するとシートの右側を指定することになります。

コピーしたシートを任意の場所に挿入(追加)する

上記でもご説明しましたが、コピーしたシートを任意の場所に挿入したい場合は、offset値を指定します。

左側に挿入したいのならマイナス値を指定し、右側に挿入したいのならプラス値を指定します。

Excelシートの移動

次は、シートの移動について見ていきたいと思います。

末尾のシートを先頭に移動する

末尾のシートを先頭に移動したい場合は、次のように記述します。

# 基本的な形
# 先頭のシートへ移動するための数を取得
front_sheet = 1 -len(wb.worksheets)

# シートの移動
wb.move_sheet(ws, offset=front_sheet)

# 保存
wb.save("Excelファイル名")

「1 -len(wb.worksheets)」で、先頭のシートへ移動するための数を取得します。

サンプルコードは、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample04.xlsx")

# 一旦、全シート名を確認
print(wb.sheetnames)

# 末尾のシートを指定
ws = wb.worksheets[-1]
print(ws)

# シートを先頭に移動
front_sheet = 1 -len(wb.worksheets)
wb.move_sheet(ws, offset=front_sheet)

# 上書き保存
wb.save("sample04.xlsx")

# 全シート名を確認
print(wb.sheetnames)

# 実行結果
['Sheet', 'Sheet1', 'Sheet2', 'Sheet3']
<Worksheet "Sheet3">
['Sheet3', 'Sheet', 'Sheet1', 'Sheet2']

末尾にあった「Sheet3」シートを、無事先頭に移動させることができました。

このやり方を覚えておくと、便利ですね。

指定したExcelシートを先頭に移動させる

これまでにご説明した内容と重複しますが、「wb.move_sheet(ws, offset=移動させたい数字)」のoffset値を指定してあげることで、先頭に移動可能です。

offset値はマイナスを指定するとシートの左側を、プラスの数字を指定するとシートの右側を指定することになります。

指定したExcelシートを末尾に移動させる

これまでにご説明した内容と重複しますが、「wb.move_sheet(ws, offset=移動させたい数字)」のoffset値を指定してあげることで、末尾に移動可能です。

offset値はマイナスを指定するとシートの左側を、プラスの数字を指定するとシートの右側を指定することになります。

指定したExcelシートを任意の場所に移動させる

こちらもこれまでにご説明した内容と重複しますが、「wb.move_sheet(ws, offset=移動させたい数字)」のoffset値を指定してあげることで、任意の場所に移動が可能です。

Excelシートの削除

ブックからシートを削除するには、ブックの変数.remove()を使用します。

それでは、見ていきましょう。

ブックの変数.remove()でシートを削除

remove()の引数には削除したいシート名を格納した、シート変数(オブジェクト)を指定します。

少しわかりにくいですね。

まずは、基本的な形を見てみましょう。

# 基本的な形
# ブックの読み込み
wb = openpyxl.load_workbook("Excelファイル名")

# シートの指定
ws = wb.worksheets[0]

# シートの削除
wb.remove(ws)

# 上書き保存
wb.save(" 同じExcelファイル名 ")

サンプルコードは、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample01.xlsx")

# シートの指定(インデックスが0番目なので、一番左のシート)
ws = wb.worksheets[0]

# シートの削除
wb.remove(ws)

# 上書き保存
wb.save("sample01.xlsx")

また、処理の最後には上書き保存をしましょう。

上書き保存をしなければ、シートは残ったままになります。

シートの指定方法:削除したいシート名を指定する

シート名を指定して削除したい場合は、次のように記述します。

# 基本的な形
# ブックの読み込み
wb = openpyxl.load_workbook("Excelファイル名")

# シートの指定
ws = wb["シート名"]

# シートの削除
wb.remove(ws)

# 上書き保存
wb.save(" 同じExcelファイル名 ") 

サンプルコードは、以下になります。

import openpyxl

# ブックの読み込み
wb = openpyxl.load_workbook("sample01.xlsx")

# シートの指定
ws = wb["Sheet2"]

# シートの削除
wb.remove(ws)

# 上書き保存
wb.save("sample01.xlsx")

シート名「Sheet2」を指定して、削除することができました。

シートの指定方法: インデックス番号を指定する

インデックス番号を使ってシートを削除するには、次のように記述します。

# 基本的な形
# ブックの読み込み
wb = openpyxl.load_workbook("Excelファイル名")

# シートの指定
ws = wb.worksheets[0]

# シートの削除
wb.remove(ws)

# 上書き保存
wb.save("同じExcelファイル名 ")

サンプルコードは、以下になります。

import openpyxl

# ブックの読み込み
wb = openpyxl.load_workbook("sample01.xlsx")

# インデックス番号「0」を指定(つまり、一番左のシート)
ws = wb.worksheets[0]

# シートの削除
wb.remove(ws)

# 上書き保存
wb.save("sample01.xlsx")

インデックス番号を指定して、シートの削除ができました。

Excelファイル(セル)の操作方法

Excelファイルのセルを操作する方法は、主に2つあります。

A1形式について

一つ目はA1形式と呼ばれる、「A1」や「B1」番地のようにアルファベットと数字でセル番地を指定する方法です。

普段、Excelファイルのセル番地を確認するときは、この方法で確認されている方が多いと思います。

R1C1形式について

二つ目はR1C1形式と呼ばれる、R(row)とC(Column)、つまり行と列を指定する方法です。

例えば、下記の画像のようにセル番地「A1」に「ここはA1セルの値です。」と入力後、セル番地「C3」に「=R[-1]C[-2]」と入力すると、セル番地「A1」の値が表示されます。

ExcelのR1C1形式の場合

もし、ExcelファイルでR1C1形式を試したい場合は、「ファイル」メニューの「オプション」>「数式」>「R1C1参照形式を使用する」にチェックを入れる必要があります(Excel2017の場合)。

因みにPythonでExcelを操作する場合、上記のようなExcelファイルの設定を変更する必要はありません。

セルの値を取得する

指定したセル番地の値(データや数式等)を取得するには、「セルの変数.value」を使用します。

import openpyxl

wb = openpyxl.load_workbook("sample05.xlsx")

# 一旦、全シート名を確認
print(wb.sheetnames)

# 「Sheet」シートを指定
ws = wb["Sheet"]

# セル番地で指定する場合
cell_01 = ws["A1"]
print(cell_01.value)

# 行列番号で指定する場合
cell_02 = ws.cell(1, 1)
print(cell_02.value)

# 実行結果
['Sheet', 'Sheet1']
ここはA1セルの値。
ここはA1セルの値。

2つの異なる方法でも特に問題なく、セルA1の値が取得できました。

セルに値を書き込む

セルに値を書き込むには、「セルの変数.value = 値」という形式を使います。

import openpyxl

wb = openpyxl.load_workbook("sample05.xlsx")

# 一旦、全シート名を確認
print(wb.sheetnames)

# 「Sheet」シートを指定
ws = wb["Sheet"]

# セル番地を指定
cell_01 = ws["B1"]

# セルに値を書き込む
cell_01.value = "チーズケーキが食べたい。"
print(cell_01.value)

# 上書き保存
wb.save("sample05.xlsx")

# 実行結果
['Sheet', 'Sheet1']
チーズケーキが食べたい。

今回は単純に文字列を書き込みましたが、日付や数式を書き込むこともできます。

また、.valueを除外しても書き込めます。

日付データを書き込む

セルに日付データを書き込む場合は、セルの変数.value = datetime.datetime(年, 月, 日)のように記述します。

# 例) セルに日付データを書き込む
cell_A1.value = datetime.datetime(2021, 9, 1)

それでは、セル(日付データ)の表示形式について、見ていきましょう。

セルの表示形式(フォーマット)を変更

セルの表示形式を変更するには、セルの変数.number_formatを使用します。

# <基本的な形>
セルの変数.number_format = "表示形式"

表示形式の主な例は、以下になります。

表示形式表示結果
yyyy/mm/dd hh:mm:ss2021/09/01 00:00:00
yyyy/mm/dd h:mm:ss2021/09/01 0:00:00
yyyy/mm/dd2021/09/01
yyyy/m/d2021/9/1
yy/m/d21/9/1
フォーマットの指定例

扱う日付データによって、使い分けられればいいと思います。

単純に日付データをセルに書き込んだ場合 (.number_format未使用)

セルの変数.number_formatを使用せず、単純に日付データをセルに書き込んだ場合は以下のようになります。

import openpyxl
import datetime

wb = openpyxl.load_workbook("sample_date01.xlsx")

# 一旦、全シート名を確認
print(wb.sheetnames)

# 「Sheet1」シートを指定
ws = wb["Sheet1"]

# セル番地を指定
cell_A1 = ws["A1"]

# セルに日付データを書き込む
cell_A1.value = datetime.datetime(2021, 9, 1)
print(cell_A1.value)

# 上書き保存
wb.save("sample_date01.xlsx")

# 実行結果
['Sheet1']
2021-09-01 00:00:00

日付データを書き込むことができました。

実際にExcelファイルを開いてみると、次のように表示されます。

number_formatで日付のフォーマットを指定

普通といえば普通ですね。

ただ、「他のフォーマット形式で日付データを表示させたい!」と思うこともあるでしょうから、次は セルの変数.number_format を使って、フォーマットを変更する方法も見ていきましょう。

セルの変数.number_format を使用

例えば、「yyyy/mm/dd hh:mm:ss」形式で表示させたい場合は、「cell_A1.number_format = ‘yyyy/mm/dd hh:mm:ss’」と記述してあげます。

import openpyxl
import datetime

wb = openpyxl.load_workbook("sample_date01.xlsx")

# 一旦、全シート名を確認
print(wb.sheetnames)

# 「Sheet1」シートを指定
ws = wb["Sheet1"]

# セル番地を指定
cell_A1 = ws["A1"]

# セルに日付データを書き込む
cell_A1.value = datetime.datetime(2021, 9, 1)

# 日付の表示形式を指定
cell_A1.number_format = 'yyyy/mm/dd hh:mm:ss'
print(cell_A1.value)

# 上書き保存
wb.save("sample_date01.xlsx")

# 実行結果
['Sheet1']
2021-09-01 00:00:00

実行した後、Excelファイルを開いてみると、

number_formatで日付のフォーマットを変更

問題なく、指定したフォーマットで表示されましたね。

表示形式については、最終的にどういった形式で表示させたいかによって記述が若干変わるので、状況によって使い分けられればいいと思います。

セルのフォントスタイルを変更する

セルのフォントを変更するには、下記のようにFontオブジェクトを取得し、セルに適用する形になります。

# 基本的な形
from openpyxl.styles import Font

# Fontオブジェクトを取得
font_obj = Font(name="フォント名", bold=True)

# セルに適用
ws["A1"].font = font_obj

また、Font()の引数は次のものがあります。

引数説明
namestringフォント名を指定します。
sizenumber数値を指定します。
boldbooleanTrue(有効) もしくはFalse(無効)を指定します。
italicboolean True(有効) もしくはFalse(無効)を指定します
Fontメソッドの引数

でわ、実際にフォントを変更してみます。

今回は、セルA1に「メイリオ」と太字を適用します。

サンプルコードは、以下になります。

import openpyxl
from openpyxl.styles import Font

wb = openpyxl.load_workbook("sample_font.xlsx")

# 「Sheet1」シートを指定
ws = wb["Sheet1"]

# Fontオブジェクトを取得
font_obj = Font(name="メイリオ", bold=True)

# セルに適用
ws["A1"].font = font_obj
ws["A1"] = "フォントを変更しました。"

# 上書き保存
wb.save("sample_font.xlsx")

実行後、Excelファイルを確認してみます。

openpyxlでフォントを変更

無事、フォントを変更することができました。

今回はメイリオを指定しましたが、いろいろなフォントを指定すればグッと幅が広がりますね。

セルを結合させる

セルを結合させるには、「シートの変数.merge_cells(セル範囲)」という形で記述します。

# 基本的な形
シートの変数.merge_cells("セル範囲")

それでは、セルA1からセルE10までをセル結合してみます。

サンプルコードは、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample_merge_cells.xlsx")

# 「Sheet1」シートを指定
ws = wb["Sheet1"]

# セルを結合
ws.merge_cells("A1:E10")

# 結合したセルにデータを書き込む
ws["A1"] = "セルを結合しました!"

# 上書き保存
wb.save("sample_merge_cells.xlsx")

実際にExcelファイルを開いてみます。

openpyxlのmerge_cellsを使って、セルを結合した

結合したセルに値を書き込む際は、結合したセルの左上のセルに書き込んであげます。

これを例えば、B1セルに値を書き込もうとすると、以下のエラーが出てしまいます。

AttributeError: 'MergedCell' object attribute 'value' is read-only

結合したセルに値を書き込む際は、左上のセルを指定することをお忘れなく。

セルの結合を解除する

結合したセルを解除するには、「シートの変数.unmerge_cells()」という形で記述します。

# 基本的な形
シートの変数.unmerge_cells("セル結合範囲")

それでは、セルA1からセルE10までセル結合された範囲を、解除してみます。

import openpyxl

wb = openpyxl.load_workbook("sample_merge_cells.xlsx")

# 「Sheet1」シートを指定
ws = wb["Sheet1"]

# 結合セルを解除
ws.unmerge_cells("A1:E10")

# セルに文字列を書き込む
ws["A1"] = "結合セルを解除しました。"

# 上書き保存
wb.save("sample_merge_cells.xlsx")

実際にExcelファイルを開いて確認してみます。

openpyxlのunmerge_cellsでセル結合を解除

セルの結合が無事、解除されました。

セルの行の高さを変更する

行の高さを変更するには、「シートの変数.row_dimensions[行番号].height = 数値」と記述します。

# 基本的な形
# 行の高さを変更
シートの変数.row_dimensions[行番号].height = 数値

でわ、実際に試してみたいと思います。

Excelの1行目の高さを変更してみます。

import openpyxl

wb = openpyxl.load_workbook("sample10.xlsx")

# 「Sheet1」シートを指定
ws = wb["Sheet1"]

# セルに書き込む
ws["A1"] = "お名前"
ws["B1"] = "住所"
ws["C1"] = "電話番号"

# 1行目の高さを「24」に変更
ws.row_dimensions[1].height = 24

# 上書き保存
wb.save("sample10.xlsx")

実行後のExcelファイルを確認してみます。

openpyxlで行の高さを変更

問題なく、行の高さが「24」に変更されたことが確認できました。

このやり方でお好きな高さに調整することができますので、いろいろお試しください。

セルの列の幅を変更 する

セルの列の幅を変更するには、以下のように記述します。

# 基本的な形
# 列の幅を変更
シートの変数.column_dimensions["列の名前"].width = 数値

でわ、実際に列の幅を変更してみたいと思います。

A列の幅を「50」に変更するサンプルコードが、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample10.xlsx")

# 「Sheet1」シートを指定
ws = wb["Sheet1"]

# セルに書き込む
ws["A1"] = "お名前"
ws["B1"] = "住所"
ws["C1"] = "電話番号"

# 1行目の高さを「24」に変更
ws.row_dimensions[1].height = 24

# A列の幅を「50」に変更
ws.column_dimensions["A"].width = 50

# 上書き保存
wb.save("sample10.xlsx")

実行後のExcelファイルを開いて確認してみます。

openpyxlで列の幅を変更

若干の誤差はありますが、ほぼ50で列の幅を変更できました。

このやり方で、お好きな列幅に変更してみてください。

数式の計算結果を取得する

数式が入ったセルを操作するには、少し注意が必要です。

これまでのように単純に「セルの変数.value」で取得すると、計算結果ではなく数式そのものを取得してしまいます。

計算結果ではなく、数式を取得してしまうケースのサンプルコードが、以下になります。

import openpyxl

wb = openpyxl.load_workbook("sample05.xlsx")

# 一旦、全シート名を確認
print(wb.sheetnames)

# 「Sheet」シートを指定
ws = wb["Sheet"]

# D5セルの値を取得
cell_01 = ws["D5"]
print(cell_01.value)

# 実行結果(計算結果ではなく、数式が取得された)
['Sheet', 'Sheet1']
=B5*C5

計算結果が欲しかったのに、数式が取得されてしまいました。

計算結果を取得したい場合は、ブックを読み込む際に

wb = openpyxl.load_workbook(“sample05.xlsx”, data_only=True)

のように、引数には「data_only=True」を付与してあげましょう。

import openpyxl

wb = openpyxl.load_workbook("sample05.xlsx", data_only=True)

# 一旦、全シート名を確認
print(wb.sheetnames)

# 「Sheet」シートを指定
ws = wb["Sheet"]

# セル番地で指定する場合
cell_01 = ws["D5"]
print(cell_01.value)

# 実行結果
['Sheet', 'Sheet1']
1000

引数に「data_only=True」を付与したことで、無事計算結果を取得することができました。

数式の計算をするのはあくまでExcel側なので、Pythonでセルに数式を書き込んだとしても保存後、一旦Excelを開きなおしてください。

ご参考コンテンツ

PythonでExcelファイルを操作することも多いのですが、その他にもCSVファイルの操作日本語などの2バイト系文字列の読み込み等があります。

下記のコンテンツもご参考にしてください。

PythonでCSVファイルを操作する

PythonでCSVファイルの読み込み、書き込みをしたい場合は、こちらもどうぞ。

Pythonで日本語などの2バイト系文字列ファイルを一行ずつ読み込む

Pythonで日本語などの2バイト系文字列のテキストファイルを一行ずつ読み込みたい場合は、こちらもどうぞ。

勇者レベル2
勇者レベル2

2バイト系文字列は、気を付けないと文字化けしてしまいますので、注意が必要です。

その他のPythonコンテンツ

Pythonでファイルの圧縮や解凍処理をする方法、ジェネレータ等のコンテンツもアップしていますので、こちらもご参考にしてください。

まとめ

PythonでExcelを操作できると、今までExcelマクロで苦労していた面倒な記述から解放されます。

コードも綺麗に整い可読性が増すので、オススメです。

ご参考になれば幸いです。

コメント

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