今すぐ役立つ【Python】と【openpyxl】 の組み合わせ。作業の爆速化!

Python

Pythonを使用することでExcel(エクセル)を簡単に読み書きすることができます。 実際にPythonを業務で使用するときに、効率化が最もわかりやすいのがExcelの操作になるので、その基本的な操作やライブラリをインストールする方法を紹介します。

  1. Pythonを使ってエクセルを操作する
  2. エクセルライブラリ openpyxl のインストール方法
  3. openpyxlでエクセルのファイル操作
    1. エクセルファイルの新規作成
    2. エクセルファイルの読み込み
    3. ファイル名やフォルダ名の取得
    4. 特定の名称のファイル名の取得
    5. 取得したフィアル名から拡張子を削除
    6. 複数のファイルを一度に処理する。
  4. openpyxlでエクセルのセル操作
    1. セルに値を書き込む
    2. セルの値を読み込む
    3. 行番号と列番号からセル名を取得する coordinate
    4. セルに罫線・対角線を引く border
    5. セルにパターン塗りつぶしを設定する PatternFill
    6. セル内の配置位置を調整する Alignment
      1. 水平位置 horizontal
      2. 垂直位置 vertical
  5. openpyxlでエクセルの列操作
    1. delete_cols(*) エクセルの列を削除する
    2. delete_cols(*,*) エクセルの列をまとめて削除する
    3. insert_cols(*) エクセルの列を挿入する
    4. insert_cols(*,*) エクセルの列をまとめて挿入する
    5. エクセルの列の幅を変更する column_dimensions[‘*’].width
    6. エクセルの列の幅をまとめて変更する
  6. openpyxlでエクセルの行操作
    1. delete_rows(*) エクセルの行を削除する
    2. delete_rows(*,*) エクセルの行をまとめて削除する
    3. insert_rows(*) エクセルの行を挿入する
    4. insert_rows(*,*) エクセルの行をまとめて挿入する
    5. エクセルの行の高さを変更する row_dimensions[*].height
    6. エクセルの行の高さをまとめて変更する
  7. openpyxlでセルの結合と解除
    1. ファイル中の全てのセルの結合の解除
    2. merge_cells(*) セルを結合する
    3. unmerge_cells(*) セルの結合を解除する

Pythonを使ってエクセルを操作する

Pythonでエクセルを操作するには、ライブラリのインストールが必要だよ!

PythonでExcel(エクセル)を操作するには大きく分けると2つの方法があります。1つめの方法はExcelのファイルを直接操作してデータの読み書きを行う方法です。もう1つはPythonからWindowsを操作してExcelを起動させて、その上でPythonからの指令でデータを読み書きする方法で、イメージとしては、マウスやキーボードの操作を人間の代わりにPythonが自動操作する方法です。
前者の場合はパソコンにExcelがインストールされている必要はありません。後者の場合はパソコンにExcelがインストールされている必要があります。
どちらを使用するにしても、Pythonに新たにExcelを操作するためのライブラリのインストールが必要です。

エクセルライブラリ openpyxl のインストール方法

ライブラリは、通常は openpyxl を使用します。

まずはライブラリをインストールする必要があります。ライブラリは先述のように操作する方法に応じてインストールします。一般的にPythonでExcel(エクセル)操作する場合は、ファイルを直接操作する事を意味するので、「openpyxl」をインストールします。「opnepyxl」を使用するメリットとしては、表中にも記載のようにExcelがインストールされている必要がないことです。業務に使用しているPCには一般的にエクセルがインストールされている事が多いと思いますが、安価なPCやRaspberry Pi等のLinux系のエッジ端末(5000円程度)を使用したい場合は、「openpyxl」を使用します。デメリットとしては、Excelの動作を完全にカバーしているわけではないので、一部には実現できない機能があります。しかし、一般的な機能は十分カバーしているので、基本は「openpyxl」を使用して、どうしてもカバーできない部分は「pywin32」を使用します。

操作方法ライブラリ名Excel(エクセル)要否
ファイルを直接読み書きするopenpyxl不要
Windowsのを操作してExcelを操作するpywin32(win32com)必要
エクセルライブラリw

Windowsでライブラリをインストールするには、メニューからw欄で出てくる「Windows PowerShell」を起動します。

Windows PowerShellを起動したら、次のコマンドを入力してリターンキーで実行します。「pip install -U ライブラリ名」コマンドは、Pythonのライブラリの最新版をインストールするコマンドです。

pip install -U openpyxl

いろいろなメッセージが表示されますが、最後に「Successfully installed openpyxl-*.*.**」と表示されればインストール成功です。

正しくインストールされたか確認してみましょう。次のコマンドをWindows PowerShellで、入力と実行をするとインストールしたバージョンが表示されます。

pip show openpyxl

下図の場合は、バージョン3.0.10がインストールされているのが確認できます。

openpyxlでエクセルのファイル操作

Pythonで、エクセルファイルを新規作成したり、

既にある、エクセルファイルを読み込んだりする方法です。

エクセルファイルの新規作成

それではPythonでExcel(エクセル)ファイルを作成してみましょう。次のコードを入力して実行すると、フォルダ内にExcelファイルが作成され、ファイルを開いてみると B2 セルに「テスト書き込み」という文字が書き込まれています。

import openpyxl as xls
book = xls.Workbook()
sheet = book.active
sheet["B2"] = "テスト書き込み"
book.save("testbook.xlsx")

作成されたエクセルファイルを確認すると、左記のようになっていると思います。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.Workbook()」は「book」という名前で、エクセルの新規ブックを作成しています。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet[“B2”] = “テスト書き込み”」は、取得したシートのB2セルに文字を書き込んでいます。

◆5行目の「book.save(“testbook.xlsx”)」は、作成したエクセルブックを「testbook.xlsx」という名前で保存しています。

まとめ 
 エクセルファイルの新規作成 
#ライブラリのインポート
import openpyxl as xls

#新規ブックの作成
book = xls.Workbook()

#シートの取得
sheet = book.active

#セルへの書き込み
sheet["B2"] = "テスト書き込み"

#ファイルの保存
book.save("ファイル名.xlsx")

エクセルファイルの読み込み

次にエクセルファイルを読み込んでみましょう。次のコードを入力して実行すると、「テスト書き込み」という文字列が表示されます。(読み込むファイルは、上で作成した testbook.xlsx です)

import openpyxl as xls
book = xls.load_workbook("testbook.xlsx")
sheet = book.worksheets[0]
cell = sheet["B2"]
print(cell.value)
テスト書き込み

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“testbook.xlsx”)」は、「testbook.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.worksheets[0]」は、これから操作するシートを指定しています。具体的には先頭のシートを指定しています。番号はシートを左から数えて何番目かを指定し、最も左の番号は「0」になります。

◆4行目の「cell = sheet[“B2”]」は、B2セルをオブジェクトとして取得しています。

◆5行目の「print(cell.value)」は、aという変数にB2セルの値を取得して入れています。

まとめ
 エクセルファイルの読み込み 
#ライブラリのインポート
import openpyxl as xls

#ファイルの読み込み
book = xls.load_workbook("ファイル名.xlsx")

#シートの取得(いずれの方法でもOK)
sheet = book.active
sheet = book.worksheets[0]
sheet = book["シート名"]

#セルの取得
cell = sheet["セル名"]

#セルの値の取得(と表示)
print(cell.value)
#エクセルのセルに計算式が設定されていても、計算結果だけを取り出したい場合はオプションに data_only=Trueを指定します。
book = xls.load_workbook("ファイル名.xlsx",data_only=True)

ファイル名やフォルダ名の取得

ファイル名やフォルダ名をまとめて取得する方法です。

ファイルやフォルダー名を取得する方法を紹介します。ファイル名とフォルダー名を全てを取得、ファイル名を取得、エクセルファイル名を取得、の3種類の方法を説明します。次のコードを入力して実行してみましょう。

import openpyxl as xls
import glob

book = xls.Workbook()
book.save("テスト13a実行結果.xlsx")
book = xls.Workbook()
book.save("テスト13b実行結果.xlsx")
book = xls.Workbook()
book.save("テスト13c実行結果.xlsx")

print(glob.glob("*"))
print(glob.glob("*.*"))
print(glob.glob("*.xlsx"))
['LOG_kaiseki8.py', 'test13.py', 'テスト13a実行結果.xlsx', 'テスト13b実行結果.xlsx', 'テスト13c実行結果.xlsx', 'データ']
['LOG_kaiseki8.py', 'test13.py', 'テスト13a実行結果.xlsx', 'テスト13b実行結果.xlsx', 'テスト13c実行結果.xlsx']
['テスト13a実行結果.xlsx', 'テスト13b実行結果.xlsx', 'テスト13c実行結果.xlsx']

実行後のフォルダ内のファイル

プログラムを実行すると3つのエクセルファイルが作成されて、その後に作成した3つのエクセルファイルも含めた、フォルダー内のファイルやフォルダー名のすべてをリストとして表示しています。(表示される名前は、実行時のPCのフォルダーに保存されている内容次第なので必ずしも、この内容にはなりません。)

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「import glob」は、ライブラリをインポートしてファイル名やフォルダ名を取得できるようにしています。ファイル名を取得するには「glob」を使用します。

◆4~8行目では、ファイル名取得のテスト用に「テスト13a実行結果.xlsx」「テスト13b実行結果.xlsx」「テスト13c実行結果.xlsx」の3つのエクセルファイルを新規に作成しています。

◆11行目の「print(glob.glob(“*”))」は、フォルダ内のファイル名やフォルダー名を取得して表示しています。「*」はワイルドカードで、これで指定する事でファイル名とフォルダー名の全てを取得しています。

◆12行目の「print(glob.glob(“*.*”))」は、フォルダ内のファイル名を取得して表示しています。「*」はワイルドカードで、これで拡張子を明示的に指定する事でファイル名のみを全てを取得しています。

◆13行目の「print(glob.glob(“*.xlsx”))」は、フォルダ内のエクセルファイル名を取得して表示しています。「*」はワイルドカードで、これで拡張子に「xlsx」を明示的に指定する事でエクセルファイル名のみを全てを取得しています。

まとめ 
 ファイル名の取得 
#ライブラリのインポート
import glob

#ワイルドカードを使用してファイル名とフォルダー名の全てを取得と表示
print(glob.glob("*"))

#ワイルドカードを使用してファイル名の全てを取得と表示
print(glob.glob("*.*"))

#ワイルドカードを使用してエクセルファイル名の全てを取得と表示
print(glob.glob("*.xlsx"))

特定の名称のファイル名の取得

特定のファイル名を取得する方法です。

多くのデータの処理をする場合は、特定の名称が付けられたファイルのデータのみを処理したい場合があります。ここでは、特定の名称のファイル名を取得する方法を紹介します。次のコードを入力して実行してみましょう。

import openpyxl as xls
import glob

book = xls.Workbook()
book.save("顧客情報1.xlsx")
book = xls.Workbook()
book.save("顧客情報2.xlsx")
book = xls.Workbook()
book.save("顧客情報3.xlsx")
book = xls.Workbook()
book.save("売上情報1.xlsx")
book = xls.Workbook()
book.save("売上情報2.xlsx")
book = xls.Workbook()
book.save("売上情報3.xlsx")

print(glob.glob("顧客*.*"))
print(glob.glob("売上*.*"))
print(glob.glob("*2*.*"))
['顧客情報1.xlsx', '顧客情報2.xlsx', '顧客情報3.xlsx']
['売上情報1.xlsx', '売上情報2.xlsx', '売上情報3.xlsx']
['売上情報2.xlsx', '顧客情報2.xlsx']

プログラムを実行すると、「顧客情報1.xlsx」「顧客情報2.xlsx」「顧客情報3.xlsx」「売上情報1.xlsx」「売上情報2.xlsx」「売上情報3.xlsx」の6つのエクセルファイルが作成されます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「import glob」は、ライブラリをインポートしてファイル名やフォルダ名を取得できるようにしています。ファイル名を取得するには「glob」を使用します。

◆4~15行目では、ファイル名取得のテスト用に「顧客情報1.xlsx」「顧客情報2.xlsx」「顧客情報3.xlsx」「売上情報1.xlsx」「売上情報2.xlsx」「売上情報3.xlsx」の6つのエクセルファイルを新規に作成しています。

◆17行目の「print(glob.glob(“顧客*.*”))」は、ファイル名に「顧客」を含むエクセルファイルを取得して表示しています。「*」はワイルドカードで、これで指定する事でファイル名とフォルダー名の全てを取得しています。

◆18行目の「print(glob.glob(“売上*.*”))」は、ファイル名に「売上」を含むエクセルファイルを取得して表示しています。「*」はワイルドカードで、これで指定する事でファイル名とフォルダー名の全てを取得しています。

◆19行目の「print(glob.glob(“*2*.*”))」は、ファイル名に「2」を含むエクセルファイルを取得して表示しています。「*」はワイルドカードで、これで指定する事でファイル名とフォルダー名の全てを取得しています。

まとめ
 特定の名称のファイル名の取得 
#ファイル名に「顧客」を含むエクセルファイルを取得と表示
print(glob.glob("顧客*.*"))

#ファイル名に「売上」を含むエクセルファイルを取得と表示
print(glob.glob("売上*.*"))

#ファイル名に「2」を含むエクセルファイルを取得と表示
print(glob.glob("*2*.*"))

取得したフィアル名から拡張子を削除

取得したフィアル名から拡張子を削除する方法です。

複数のファイルを一度に処理する時に、取得したファイル名の「拡張子」を削除したい場合があります。ここでは、取得したファイル名から拡張子を削除する方法を紹介します。次のコードを入力して実行してみましょう。

import openpyxl as xls
import glob

book = xls.Workbook()
book.save("顧客情報1.xlsx")
book = xls.Workbook()
book.save("顧客情報2.xlsx")
book = xls.Workbook()
book.save("顧客情報3.xlsx")
book = xls.Workbook()
book.save("売上情報1.xlsx")
book = xls.Workbook()
book.save("売上情報2.xlsx")
book = xls.Workbook()
book.save("売上情報3.xlsx")

#エクセルのファイル名を取得(拡張子がxlsxのファイル名を取得)
fnames0 = []
for name in glob.glob("*.xlsx"):
    fnames0.append(name)

#ファイル名の拡張子を削除
fnames1 = []
for name in fnames0:
    name1 = name[:len(name)-5]
    fnames1.append(name1)

print(fnames0)
print(fnames1)
['売上情報1.xlsx', '売上情報2.xlsx', '売上情報3.xlsx', '顧客情報1.xlsx', '顧客情報2.xlsx', '顧客情報3.xlsx']
['売上情報1', '売上情報2', '売上情報3', '顧客情報1', '顧客情報2', '顧客情報3']

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「import glob」は、ライブラリをインポートしてファイル名やフォルダ名を取得できるようにしています。ファイル名を取得するには「glob」を使用します。

◆4~15行目では、ファイル名取得のテスト用に「顧客情報1.xlsx」「顧客情報2.xlsx」「顧客情報3.xlsx」「売上情報1.xlsx」「売上情報2.xlsx」「売上情報3.xlsx」の6つのエクセルファイルを新規に作成しています。

◆18~20行目のでは、エクセルファイルを取得しています。fnames0という名前の「リスト」を作って、その中に順番に取得したファイル名を格納しています。

◆23~26行目のでは、取得したファイル名のリストfnames1から、1つ1つファイル名のテキストを取り出して、拡張子の部分の末尾5文字を削除して、新たにfnames1という名前の「リスト」を作って、その中に順番に格納しています。

◆28行目の「print(fnames0)」は、拡張子を削除する前のファイル名を表示しています。

◆29行目の「print(fnames1)」は、拡張子を削除する後の名称を表示しています。

まとめ
 取得したファイル名から拡張子を削除 
#エクセルのファイル名を取得(拡張子がxlsxのファイル名を取得)
fnames0 = []
for name in glob.glob("*.xlsx"):
    fnames0.append(name)

#ファイル名の拡張子を削除するには、テキストデータの末尾5文字を削除
fnames1 = []
for name in fnames0:
    name1 = name[:len(name)-5]
    fnames1.append(name1)

複数のファイルを一度に処理する。

複数のファイルを一度に処理してみます。

仕事では複数のファイルを一度に処理する必要があります。ここでは取得した複数のエクセルファイルを一度に処理する方法を説明します。次のコードを入力して実行してみましょう。

import openpyxl as xls
import glob

book = xls.Workbook()
book.save("顧客情報1.xlsx")
book = xls.Workbook()
book.save("顧客情報2.xlsx")
book = xls.Workbook()
book.save("顧客情報3.xlsx")
book = xls.Workbook()
book.save("売上情報1.xlsx")
book = xls.Workbook()
book.save("売上情報2.xlsx")
book = xls.Workbook()
book.save("売上情報3.xlsx")

#エクセルのファイル名を取得(拡張子がxlsxのファイル名を取得)
fnames0 = []
for name in glob.glob("*.xlsx"):
    fnames0.append(name)

#関数を定義する
def mainSyori(str_filename):
    book = xls.load_workbook(str_filename)
    sheet = book.active
    sheet.cell(row=3,column=2).value = "かきくけこ"
    book.save(str_filename)
    book.close

#メインループ
for str_filename in fnames0:
    mainSyori(str_filename)

プログラムを実行すると、「顧客情報1.xlsx」「顧客情報2.xlsx」「顧客情報3.xlsx」「売上情報1.xlsx」「売上情報2.xlsx」「売上情報3.xlsx」の6つのエクセルファイルが作成されて、エクセルファイルを開いてみるとB3セルに ”かきくけこ” が記入されています。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「import glob」は、ライブラリをインポートしてファイル名やフォルダ名を取得できるようにしています。ファイル名を取得するには「glob」を使用します。

◆4~15行目では、ファイル名取得のテスト用に「顧客情報1.xlsx」「顧客情報2.xlsx」「顧客情報3.xlsx」「売上情報1.xlsx」「売上情報2.xlsx」「売上情報3.xlsx」の6つのエクセルファイルを新規に作成しています。

◆18~20行目のでは、エクセルファイルを取得しています。fnames0という名前の「リスト」を作って、その中に順番に取得したファイル名を格納しています。

◆23~28行目のでは、関数を定義してエクセルファイルに行う処理内容を記載しています。ファイル名を関数の引数として渡して、そのファイルを開いた後に3行目の2列目のセル(B3セル)に文字列の”かきくけこ”を記入して、最後にファイルをクローズしています。

◆31~22行目がメインプログラムになります。fnames0のファイル名を一つ一つ取り出して、関数を呼び出して全部のファイルに処理を実施しています。

まとめ
 複数のファイルを一度に処理 
#複数のファイルを一度に処理するには、全ファイル名を取得した後に関数を定義して、関数を呼び出して処理します。

#エクセルのファイル名を取得(拡張子がxlsxのファイル名を取得)
fnames0 = []
for name in glob.glob("*.xlsx"):
    fnames0.append(name)

#関数を定義する
def mainSyori(str_filename):
    book = xls.load_workbook(str_filename)
    sheet = book.active
    sheet.cell(row=3,column=2).value = "かきくけこ"
    book.save(str_filename)
    book.close

#メインループ
for str_filename in fnames0:
    mainSyori(str_filename)

openpyxlでエクセルのセル操作

セルに値を書込するときは、シートとセルを指定して書込を行います。セルの指定方法は、セル名称で指定する方法と、行番号と列番号を指定する方法、があります。

セルに値を書込・読込する方法、セル名を取得する方法です。

セルに値を書き込む

セルの指定方法は次の2つがある。
・セル名称で指定する方法
・行番号と列番号で指定する方法
次のコードを実行してみましょう。

import openpyxl as xls
book = xls.Workbook()
sheet = book.active
sheet["B2"] = "パソコン"
sheet.cell(row=3,column=2).value = "自動車"
book.save("テスト13実行結果.xlsx")

プログラムを実行すると「テスト13実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとB2とB3セルに値が書き込まれています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.Workbook()」は「book」という名前で、エクセルの新規ブックを作成しています。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet[“B2”] = “パソコン”」は、シートを「sheet」、セルを「B2」に指定して、値=「パソコン」を書き込みしています。セルを指定するときはダブルクォーテーションを忘れないようにしましょう。

◆5行目の「sheet.cell(row=3,column=2).value = “自動車”」は、シートを「sheet」、セルの行番号=3、列番号=2を指定して、値=「自動車」を書き込みしています。列番号はA列を1として指定します。4行目とは別の方法で書き込みしています。

◆6行目の「book.save(“テスト13実行結果.xlsx”)」は、作成したエクセルブックを「テスト13実行結果.xlsx」という名前で保存しています。

まとめ
 セルに値を書き込む 
#セルに値を書込するときは、書き込みしたいシートとセルを指定する
#セルの指定方法はどちらでもよい

sheet["セル名称"] = "値"
sheet.cell(row=行番号,column=列番号).value = "値"

セルの値を読み込む

セルの値を読込するときは、シートとセルを指定して書込を行います。セルの指定方法は、セル名称で指定する方法と、行番号と列番号を指定する方法、があります。

セルの指定方法は次の2つがある。
・セル名称で指定する方法
・行番号と列番号で指定する方法
次のコードを実行してみましょう。エクセルファイルは、先述の書き込みで作成したファイルを使用します。

import openpyxl as xls
book = xls.load_workbook("テスト13実行結果.xlsx")
sheet = book.active
print(sheet["B2"].value)
print(sheet.cell(row=3,column=2).value)
パソコン
自動車

プログラムを実行すると「テスト13実行結果.xlsx」というエクセルファイルを読み込みして、B2とB3セルの値をターミナルに表示します。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト13実行結果.xlsx”)」は、「テスト13実行結果.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.worksheets[0]」は、これから操作するシートを指定しています。具体的には先頭のシートを指定しています。番号はシートを左から数えて何番目かを指定し、最も左の番号は「0」になります。

◆4行目の「print(sheet[“B2”].value)」は、シートを「sheet」、セルを「B2」に指定して、読み込んだ値をターミナルに表示しています。セルを指定するときはダブルクォーテーションを忘れないようにしましょう。

◆5行目の「print(sheet.cell(row=3,column=2).value)」は、シートを「sheet」、セルの行番号=3、列番号=2を指定して、値をターミナルに表示しています。列番号はA列を1として指定します。4行目とは別の方法で読み込みしています。

まとめ 
 セルの値を読み込む 
#セルの値を読込するときは、読み込みしたいシートとセルを指定する
#セルの指定方法はどちらでもよい

sheet["セル名称"] 
sheet.cell(row=行番号,column=列番号).value

行番号と列番号からセル名を取得する coordinate

行番号と列番号を指定する事で、エクセルの「セル名」を取得する事ができます。セル名とは”A3”や”F5”といった、エクセル内のセルを指定する時に使用する名称です。絶対アドレスのセル名を取得する方法も記載します。次のコードを実行してみましょう。

import openpyxl as xls
from openpyxl.utils import absolute_coordinate
book = xls.Workbook()
sheet = book.active
print(sheet.cell(row=4,column=3).coordinate)
print(absolute_coordinate(sheet.cell(row=4,column=3).coordinate))
C4
$C$4

プログラムを実行すると「C4」「$C$4」がターミナルに表示します。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「from openpyxl.utils import absolute_coordinate」は、ライブラリをインポートしてabusolute_coordinateを使用できるようにしています。絶対アドレスのセル名称を取得したい場合に使用します。

◆3行目の「book = xls.Workbook()」は「book」という名前で、エクセルの新規ブックを作成しています。

◆4行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆5行目の「print(sheet.cell(row=4,column=3).coordinate)」は、シートを「sheet」、行番号=4、列番号=3を指定して、取得したセル名をターミナルに表示しています。

◆6行目の「print(absolute_coordinate(sheet.cell(row=4,column=3).coordinate))」は、シートを「sheet」、行番号=4、列番号=3を指定して、取得したセル名を、絶対アドレスのセル名に変換して、ターミナルに表示しています。

まとめ
 行番号と列番号からセル名を取得する 
#セル名を取得するときは、取得したいセル名の行番号と列番号を指定する
sheet.cell(row=行番号,column=列番号).coordinate

#絶対アドレスのセル名を取得したい場合は、absolute_coordinateを使用する
absolute_coordinate("セル名")

セルに罫線・対角線を引く border

セルに罫線や対角線を引くことが出来ます。

openpyxlを使用する事でセルに罫線や対角線を引く事ができます。セルの罫線は、位置、太さ、色をする事ができます。次のコードを実行してみましょう。

import openpyxl as xls
from openpyxl.styles.borders import Border,Side
book = xls.Workbook()
sheet = book.active
sheet.row_dimensions[2].height = 50
sheet.row_dimensions[5].height = 50
sheet.cell(row=2,column=2).border = Border(
    top = Side(style='hair',color='FF0000'),
    right = Side(style='thin',color='FF0000'),
    bottom = Side(style='medium',color='FF0000'),
    left = Side(style='thick',color='FF0000'),
    )
sheet.cell(row=5,column=3).border = Border(
    top = Side(style='double',color='0000FF'),
    right = Side(style='dotted',color='0000FF'),
    bottom = Side(style='dashed',color='0000FF'),
    left = Side(style='dashDot',color='0000FF'),
    )
sheet.cell(row=2,column=4).border = Border(
    top = Side(style='dashDotDot',color='000000'),
    right = Side(style='mediumDashed',color='000000'),
    bottom = Side(style='mediumDashDot',color='000000'),
    left = Side(style='mediumDashDotDot',color='000000'),
)
sheet.cell(row=5,column=5).border = Border(
    top = Side(style='slantDashDot',color='FF0000'),
    diagonal = Side(style='thin',color='00FF00'),
    diagonalUp = True,
    diagonalDown = True,
    )
book.save("テスト14実行結果.xlsx")

プログラムを実行すると「テスト14実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとB2,C5,D2,E5セルに罫線や対角線が引かれてています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「from openpyxl.styles.borders import Border,Side」は、ライブラリをインポートして罫線を引く命令を使用できるようにしています。

◆3行目の「book = xls.Workbook()」は「book」という名前で、エクセルの新規ブックを作成しています。

◆4行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆5,6行目は、実行結果を分かりやすくするために、エクセルの行の高さを変更しています。

◆7~30行目でセルに罫線を引いています。罫線を引く場合は、セルの指定、場所の指定、線種の指定、色の指定、を行います。対角線を引く事も可能で27~29行目で対角線を引いています。

◆31行目の「book.save(“テスト14実行結果.xlsx”)」は、作成したエクセルブックを「テスト14実行結果.xlsx」という名前で保存しています。



罫線の場所は4種類が指定出来て、top(上)、right(右)、bottom(下)、left(左)で指定します。

場所の指定説明
‘top’セルの上
‘right’セルの右
‘bottom’セルの下
‘left’セルの左
‘diagonalUp’ = True右上がりの対角線 diagonal とペアで使用する
‘diagonalDown’ = True右下がりの対角線 diagonal とペアで使用する
罫線の場所、対角線



線種は全部で13種類が指定できて、下表に一覧を記載します。

線種の指定説明線種の指定説明
‘none’なし‘mediumDashDotDot’中線の二点鎖線
‘hair’極細線‘slantDashDot’斜めに切れ目の入った一点鎖線
‘dotted’点線‘mediumDashDot’中線の一点鎖線
‘dashDotDot’二点鎖線‘mediumDashed’中線の破線
‘dashDot’一点鎖線‘medium’中線
‘dashed’破線‘thick’太線
‘thin’細線‘double’二重線
罫線の線種



色の指定はRGBの16進数で指定します。下表に最も基本的な色を記載します。

色指定説明色指定説明色指定説明
FF000000FF000000FF
色指定
まとめ
 セルに罫線・対角線を引く 
#セルに罫線や対角線を引くときは、セルの指定、罫線の場所、罫線の線種、罫線の色を指定する

#罫線
sheet.cell(row=行番号,column=列番号).border = Border(
    罫線の場所 = Side(style='線種',color='RGBの色番号'),
    )

#対角線
sheet.cell(row=行番号,column=列番号).border = Border(
    diagonal = Side(style='線種',color='RGBの色番号'),
    diagonalUp = True,
    diagonalDown = True,
    )

セルにパターン塗りつぶしを設定する PatternFill

セルにパターン塗りつぶしを設定できます。

openpyxlを使用する事でセルにパターン塗りつぶしを設定する事ができます。次のコードを実行してみましょう。

import openpyxl as xls
from openpyxl.styles import PatternFill
book = xls.Workbook()
sheet = book.active
sheet.column_dimensions["A"].width = 14
sheet.column_dimensions["D"].width = 14
for i in range(1,19):
    sheet.row_dimensions[i].height = 25

sheet.cell(row=1,column=1).value = 'solid'
sheet.cell(row=2,column=1).value = 'darkDown'
sheet.cell(row=3,column=1).value = 'darkGray'
sheet.cell(row=4,column=1).value = 'darkGrid'
sheet.cell(row=5,column=1).value = 'darkHorizontal'
sheet.cell(row=6,column=1).value = 'darkTrellis'
sheet.cell(row=7,column=1).value = 'darkUp'
sheet.cell(row=8,column=1).value = 'darkVertical'
sheet.cell(row=9,column=1).value = 'gray0625'
sheet.cell(row=1,column=4).value = 'gray125'
sheet.cell(row=2,column=4).value = 'lightDown'
sheet.cell(row=3,column=4).value = 'lightGray'
sheet.cell(row=4,column=4).value = 'lightGrid'
sheet.cell(row=5,column=4).value = 'lightHorizontal'
sheet.cell(row=6,column=4).value = 'lightTrellis'
sheet.cell(row=7,column=4).value = 'lightUp'
sheet.cell(row=8,column=4).value = 'lightVertical'
sheet.cell(row=9,column=4).value = 'mediumGray'

sheet.cell(row=1,column=2).fill = PatternFill(fill_type='solid',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=2,column=2).fill = PatternFill(fill_type='darkDown',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=3,column=2).fill = PatternFill(fill_type='darkGray',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=4,column=2).fill = PatternFill(fill_type='darkGrid',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=5,column=2).fill = PatternFill(fill_type='darkHorizontal',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=6,column=2).fill = PatternFill(fill_type='darkTrellis',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=7,column=2).fill = PatternFill(fill_type='darkUp',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=8,column=2).fill = PatternFill(fill_type='darkVertical',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=9,column=2).fill = PatternFill(fill_type='gray0625',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=1,column=5).fill = PatternFill(fill_type='gray125',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=2,column=5).fill = PatternFill(fill_type='lightDown',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=3,column=5).fill = PatternFill(fill_type='lightGray',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=4,column=5).fill = PatternFill(fill_type='lightGrid',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=5,column=5).fill = PatternFill(fill_type='lightHorizontal',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=6,column=5).fill = PatternFill(fill_type='lightTrellis',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=7,column=5).fill = PatternFill(fill_type='lightUp',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=8,column=5).fill = PatternFill(fill_type='lightVertical',fgColor='FF9955',bgColor='2255FF')
sheet.cell(row=9,column=5).fill = PatternFill(fill_type='mediumGray',fgColor='FF9955',bgColor='2255FF')

book.save("テスト15実行結果.xlsx")

プログラムを実行すると「テスト15実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとセルに着色やパターンが設定されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「from openpyxl.styles import PatternFill」は、ライブラリをインポートしてパターン塗りつぶし機能を使用できるようにしています。

◆3行目の「book = xls.Workbook()」は「book」という名前で、エクセルの新規ブックを作成しています。

◆4行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆5,6行目は、実行結果を分かりやすくするために、エクセルの列の幅を変更しています。

◆7,8行目は、実行結果を分かりやすくするために、エクセルの行の高さを変更しています。

◆10~27行目は、実行結果を分かりやすくするために、パターン名称をエクセルに記述しています。

◆29~46行目で、セルの着色やパターンの設定を実行しています。パターンタイプ、fgcolorで前景色、bgcolorで背景色を指定しています。

◆48行目の「book.save(“テスト15実行結果.xlsx”)」は、作成したエクセルブックを「テスト15実行結果.xlsx」という名前で保存しています。



パターンタイプは全部で18種類の指定が可能です。

パターンタイプ説明パターンタイプ説明
‘solid’塗りつぶし‘gray125’12.5%灰色
‘darkDown’右下がり斜線 縞‘lightDown’実線 右下がり斜線 縞
‘darkGray’75%灰色‘lightGray’25%灰色
‘darkGrid’右下がり斜線 格子‘lightGrid’実線 横 格子
‘darkHorizontal’横縞‘lightHorizontal’実線 横 縞
‘darkTrellis’極太線 左下がり斜線 格子‘lightTrellis’実線 左下がり斜線 格子
‘darkUp’左下がり斜線 縞‘lightUp’実線 左下がり斜線 縞
‘darkVertical’縦縞‘lightVertical’実線 縦 縞
‘gray0625’6.25%灰色‘mediumGray’50%灰色
パターンの種類



色の指定はRGBの16進数で指定します。下表に最も基本的な色を記載します。

色指定説明色指定説明色指定説明
FF000000FF000000FF
色指定
まとめ
 セルにパターン塗りつぶしを設定する 
#セルの着色やパターンを設定するときは、セルの指定、パターンの種類、前景色、背景色を指定する
sheet.cell(row=行番号,column=列番号).fill = PatternFill(fill_type="パターンの種類",fgColor="前景色",bgColor="背景色")

セル内の配置位置を調整する Alignment

セル内での配置位置を調整する事ができます。

水平位置 horizontal

openpyxlを使用する事でセル内での水平位置の調整ができます。次のコードを実行してみましょう。

import openpyxl as xls
book = xls.Workbook()
sheet = book.active

for i in range(1,10):
    sheet.row_dimensions[i].height = 25
rows = ["A","B","C","D","E","F","G","H","I"]
for row_str in rows:
    sheet.column_dimensions[row_str].width = 14

sheet['A1'].value = "標準"
sheet['B1'].value = "左詰め"
sheet['C1'].value = "中央揃え"
sheet['D1'].value = "右詰め"
sheet['E1'].value = "繰り返し"
sheet['F1'].value = "両端揃え"
sheet['G1'].value = "選択範囲内で中央"
sheet['I1'].value = "均等割り付け"

for i in range(1,10):
    sheet.cell(row=2,column=i).value = "横位置"
sheet['H2'].value = None

sheet['A2'].alignment = xls.styles.Alignment(horizontal='general')
sheet['B2'].alignment = xls.styles.Alignment(horizontal='left')
sheet['C2'].alignment = xls.styles.Alignment(horizontal='center')
sheet['D2'].alignment = xls.styles.Alignment(horizontal='right')
sheet['E2'].alignment = xls.styles.Alignment(horizontal='fill')
sheet['F2'].alignment = xls.styles.Alignment(horizontal='justify')
sheet['G2'].alignment = xls.styles.Alignment(horizontal='centerContinuous')
sheet['H2'].alignment = xls.styles.Alignment(horizontal='centerContinuous')
sheet['I2'].alignment = xls.styles.Alignment(horizontal='distributed')

book.save("テスト16実行結果.xlsx")

プログラムを実行すると「テスト16実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとセル内の位置が調整されています。この内容について一つずつ説明していきます。



◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.Workbook()」は「book」という名前で、エクセルの新規ブックを作成しています。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆5~9行目は、実行結果を分かりやすくするために、エクセルの列の幅と行の高さを変更しています。

◆11~18行目は、実行結果を分かりやすくするために、調整の名称を記載しています。

◆20~22行目は、各調整結果を確認するために「横位置」という文字を各セルに記入しています。

◆24~32行目は、位置の調整を実施しています。

◆34行目の「book.save(“テスト16実行結果.xlsx”)」は、作成したエクセルブックを「テスト16実行結果.xlsx」という名前で保存しています。


水平位置の調整には、次の8種類を指定する事が出来ます。

水平位置の種類説明
‘general’標準
‘left’左詰め
‘center’中央揃え
‘right’右詰め
‘fill’繰り返し
‘justify’両端揃え
‘centerContinuous’選択範囲内で中央
‘distributed’均等割り付け
水平位置種類
まとめ
 セル内の配置位置調整 水平位置 
#セルの水平位置を調整する時は、Alignment,horizontalで指定する。
sheet['セル名'].alignment = xls.styles.Alignment(horizontal='水平位置種類')

垂直位置 vertical

openpyxlを使用する事でセル内での垂直位置の調整ができます。次のコードを実行してみましょう。

import openpyxl as xls
book = xls.Workbook()
sheet = book.active

for i in range(1,4):
    sheet.row_dimensions[i].height = 80
rows = ["A","B","C","D","E"]
for row_str in rows:
    sheet.column_dimensions[row_str].width = 14

sheet['A1'].value = "上詰め"
sheet['B1'].value = "中央揃え"
sheet['C1'].value = "下詰め"
sheet['D1'].value = "両端揃え"
sheet['E1'].value = "均等割り付け"

for i in range(1,4):
    sheet.cell(row=2,column=i).value = "縦位置"
sheet.cell(row=2,column=4).value = "あいうえおかきくけこさしすせそたちつてと"
sheet.cell(row=2,column=5).value = "あいうえお\nかきくけこ\nさしすせそ\nたちつてと"

sheet['A2'].alignment = xls.styles.Alignment(vertical='top')
sheet['B2'].alignment = xls.styles.Alignment(vertical='center')
sheet['C2'].alignment = xls.styles.Alignment(vertical='bottom')
sheet['D2'].alignment = xls.styles.Alignment(vertical='justify')
sheet['E2'].alignment = xls.styles.Alignment(vertical='distributed')

book.save("テスト17実行結果.xlsx")

プログラムを実行すると「テスト17実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとセル内の位置が調整されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.Workbook()」は「book」という名前で、エクセルの新規ブックを作成しています。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆5~9行目は、実行結果を分かりやすくするために、エクセルの列の幅と行の高さを変更しています。

◆11~15行目は、実行結果を分かりやすくするために、調整の名称を記載しています。

◆17~20行目は、各調整結果を確認するために文字を各セルに記入しています。

◆22~26行目は、位置の調整を実施しています。

◆34行目の「book.save(“テスト17実行結果.xlsx”)」は、作成したエクセルブックを「テスト17実行結果.xlsx」という名前で保存しています。


水平位置の調整には、次の5種類を指定する事が出来ます。

水平位置の種類説明
‘top’上詰め
‘center’中央揃え
‘bottom’下詰め
‘justify’両端揃え
‘distributed’均等割り付け
垂直位置種類
まとめ
 セル内の配置位置調整 垂直位置 
#セルの垂直位置を調整する時は、Alignment,verticalで指定する。
sheet['セル名'].alignment = xls.styles.Alignment(vertical='垂直位置種類')

openpyxlでエクセルの列操作

エクセルの「列」を、いろいろ操作する方法です。

delete_cols(*) エクセルの列を削除する

openpyxlでエクセルの列を削除する事が出来ます。列の削除はdelete_colsで行います。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルのB列を削除してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
sheet.delete_cols(2)
book.save("テスト03実行結果.xlsx")

プログラムを実行すると「テスト03実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとB列が削除されています(正確にはB列が削除され、元のC列以降が左に詰められています)。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet.delete_cols(2)」でエクセルの列を削除しています。カッコ( )の中に削除したい列を指定する事で列を削除します。エクセルでは列の名前がA,B,C,・・・というようにアルファベットの名前が付けられていますが、openpyxlで列を指定する場合は一番左のA列を1として、数字で指定します。B列は2番目になるのでカッコ( )の中に2を指定しています。

◆5行目の「book.save(“テスト03実行結果.xlsx”)」は、作成したエクセルブックを「テスト03実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの列を削除する 
#削除する列はカッコ( )内に数字で指定する。A列を1として指定する。
sheet.delete_cols(列番号)

delete_cols(*,*) エクセルの列をまとめて削除する

openpyxlでエクセルの列をまとめて削除する事が出来ます。 まとめて列を削除する場合でもdelete_colsで行います。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルのB列~D列の幅をまとめて削除してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
sheet.delete_cols(2,3)
book.save("テスト04実行結果.xlsx")

プログラムを実行すると「テスト04実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとB~D列が削除されています(正確にはB列~D列が削除され、元のE列以降が左に詰められています)。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet.delete_cols(2,3)」でエクセルの列を削除しています。カッコ( )の中に削除したい列の開始列と何列分削除するかを指定する事で列をまとめて削除します。エクセルでは列の名前がA,B,C,・・・というようにアルファベットの名前が付けられていますが、openpyxlで列を指定する場合は一番左のA列を1として、数字で指定します。B列は2番目になるのでカッコ( )の中に2を指定しています。3列分削除するので続けて3を指定しています。

◆5行目の「book.save(“テスト04実行結果.xlsx”)」は、作成したエクセルブックを「テスト04実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの列をまとめて削除する 
#列をまとめて削除する場合は、削除開始列と削除列数をカッコ( )内に数字で指定する。A列を1として指定する。
sheet.delete_cols(削除開始列,削除列数)

insert_cols(*) エクセルの列を挿入する

openpyxlでエクセルの列を挿入する事が出来ます。列の挿入はinsert_colsで行います。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルのC列の場所に列を挿入してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
sheet.insert_cols(3)
book.save("テスト05実行結果.xlsx")

プログラムを実行すると「テスト05実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとC列の場所に列が挿入されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet.insert_cols(3)」でエクセルの列を挿入しています。カッコ( )の中に挿入したい列の場所を指定する事で列を挿入します。エクセルでは列の名前がA,B,C,・・・というようにアルファベットの名前が付けられていますが、openpyxlで列を指定する場合は一番左のA列を1として、数字で指定します。C列は3番目になるのでカッコ( )の中に3を指定しています。

◆5行目の「book.save(“テスト05実行結果.xlsx”)」は、作成したエクセルブックを「テスト05実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの列を挿入する 
#列を挿入する時はカッコ( )内に挿入したい場所を数字で指定する。A列を1として指定する。
sheet.insert_cols(挿入場所)

insert_cols(*,*) エクセルの列をまとめて挿入する

openpyxlでエクセルの列をまとめて挿入する事が出来ます。 まとめて列を挿入する場合でもinsert_colsで行います。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルのC列の場所に列を2列分まとめて挿入してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
sheet.insert_cols(3,2)
book.save("テスト06実行結果.xlsx")

プログラムを実行すると「テスト06実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとC列の場所に列が2列分挿入されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet.insert_cols(3,2)」でエクセルの列を挿入しています。カッコ( )の中に挿入場所と挿入列数を指定する事で列を挿入します。エクセルでは列の名前がA,B,C,・・・というようにアルファベットの名前が付けられていますが、openpyxlで列を指定する場合は一番左のA列を1として、数字で指定します。C列は3番目になるのでカッコ( )の中に3を指定しています。2列分挿入していので、続けて2を指定します。

◆5行目の「book.save(“テスト06実行結果.xlsx”)」は、作成したエクセルブックを「テスト06実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの列をまとめて挿入する 
#まとめて列を挿入する時はカッコ( )内に挿入したい場所と挿入列数を数字で指定する。A列を1として指定する。
sheet.insert_cols(挿入場所,挿入列数)

エクセルの列の幅を変更する column_dimensions[‘*’].width

openpyxlを使ってエクセルの列の幅を変更する事ができます。列の幅を変更は基本的に1列ずつ変更するコードを記述する必要がありますが、プログラムを工夫する事により簡単に複数列の幅を変更する事が出来ます。まずは1列ずつ変更する方法を説明します。column_dimensionsで列の幅を変更します。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルのB列とC列の幅を変更してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
sheet.column_dimensions['B'].width = 20
sheet.column_dimensions['C'].width = 12
book.save("テスト01実行結果.xlsx")

プログラムを実行すると「テスト01実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとB列とC列の幅が変更されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。後半のdata_only=Trueは読み込み時のオプション指定で、エクセルではセルに計算式が設定されている事があり、この指定が無い場合は計算式をセルの値として読み込みますが、この指定をする事により計算式の結果を読み込む事が出来ます。今回のサンプルプログラムには関係しませんが、参考として記述しました。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet.column_dimensions[‘B’].width = 20」と5行目の「sheet.column_dimensions[‘C’].width = 12」で列の幅を変更しています。この場合はB列の幅を20に変更、C列の幅を12に変更しています。

◆6行目の「book.save(“テスト01実行結果.xlsx”)」は、作成したエクセルブックを「テスト01実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの列の幅を変更する 
#column_dimensionsで変更したい列と、幅を指定する
sheet.column_dimensions['列'].width = 幅

エクセルの列の幅をまとめて変更する

openpyxlでは列の幅をまとめて変更する命令はありませんが簡単なプログラムを記述することで、エクセルの列の幅をまとめて変更することが出来ます。まとめて変更する時はcolumn_dimensionsを繰り返し実行します。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルのA列~E列の幅をまとめて変更してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx")
sheet = book.active
rows = ["A","B","C","D","E"]
for row_str in rows:
    sheet.column_dimensions[row_str].width = 4
book.save("テスト02実行結果.xlsx")

プログラムを実行すると「テスト02実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみるとA列~E列の幅が変更されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目からが、まとめて列の幅を変更する方法になります。「rows = [“A”,”B”,”C”,”D”,”E”]」の部分で変更したい列をリストとして定義しています。

◆5行目と6行目の「for row_str in rows: sheet.column_dimensions[row_str].width = 4」の部分は、繰り返しの構文であるfor文を使用して、4行目で定義した列の名前を1つずつ取り出して、列の幅の変更を繰り返し実行しています。

◆7行目の「book.save(“テスト02実行結果.xlsx”)」は、作成したエクセルブックを「テスト02実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの列の幅をまとめて変更する 
#列の幅をまとめて変更したい場合はリストとfor文を使用して繰り返し実行で変更する。witdthで幅を指定する。

rows = ["列名","列名","列名","列名","列名"]
for row_str in rows:
    sheet.column_dimensions[row_str].width = 列幅

openpyxlでエクセルの行操作

エクセルの「行」を、いろいろ操作する方法です。

delete_rows(*) エクセルの行を削除する

openpyxlでエクセルの行を削除する事が出来ます。行の削除はdelete_rowsで行います。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルの2行目を削除してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
sheet.delete_rows(2)
book.save("テスト07実行結果.xlsx")

プログラムを実行すると「テスト07実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみると2行目が削除されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet.delete_rows(2)」でエクセルの2行目を削除しています。カッコ( )の中に削除する行を指定する事で行を削除します。

◆5行目の「book.save(“テスト07実行結果.xlsx”)」は、作成したエクセルブックを「テスト07実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの行を削除する 
#削除する行はカッコ( )内に数字で指定する。
sheet.delete_rows(削除行)

delete_rows(*,*) エクセルの行をまとめて削除する

openpyxlでエクセルの行をまとめて削除する事が出来ます。行をまとめて削除する場合もdelete_rowsで行います。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルの2行目と3行目をまとめて削除してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
sheet.delete_rows(2,2)
book.save("テスト08実行結果.xlsx")

プログラムを実行すると「テスト08実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみると2行目と3行目が削除されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet.delete_rows(2,2)」でエクセルの2行目と3行目を削除しています。カッコ( )の中に削除開始行と削除行数を指定する事で行をまとめて削除します。

◆5行目の「book.save(“テスト08実行結果.xlsx”)」は、作成したエクセルブックを「テスト08実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの行をまとめて削除する 
#削除開始行と削除行数をカッコ( )内に数字で指定する。
sheet.delete_rows(削除開始行,削除行数)

insert_rows(*) エクセルの行を挿入する

openpyxlでエクセルの行を挿入する事が出来ます。行の挿入はinsert_rowsで行います。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルの3行目に行を挿入してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
sheet.insert_rows(3)
book.save("テスト09実行結果.xlsx")

プログラムを実行すると「テスト09実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみると3行目に行が挿入されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet.insert_rows(3)」でエクセルの2行目に行を挿入しています。カッコ( )の中に挿入する場所を指定する事で行を挿入します。

◆5行目の「book.save(“テスト09実行結果.xlsx”)」は、作成したエクセルブックを「テスト09実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの行を挿入する 
#行を挿入する場所はカッコ( )内に数字で指定する。
sheet.insert_rows(行挿入場所)

insert_rows(*,*) エクセルの行をまとめて挿入する

openpyxlでエクセルの行をまとめて挿入する事が出来ます。まとめて行を挿入する場合もinsert_rowsで行います。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルの4行目から行を2行挿入してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
sheet.insert_rows(4,2)
book.save("テスト10実行結果.xlsx")

プログラムを実行すると「テスト10実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみると4行目から行が2行挿入されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet.insert_rows(4,2)」でエクセルの4行目から行を2行挿入しています。カッコ( )の中に挿入開始行と挿入行数を指定する事でまとめて行を挿入します。

◆5行目の「book.save(“テスト10実行結果.xlsx”)」は、作成したエクセルブックを「テスト10実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの行をまとめて挿入する 
#挿入開始行と挿入行数をカッコ( )内に数字で指定する。
sheet.insert_rows(挿入開始行,挿入行数)

エクセルの行の高さを変更する row_dimensions[*].height

openpyxlを使ってエクセルの行の高さを変更する事ができます。行の高さを変更は基本的に1行ずつ変更するコードを記述する必要がありますが、プログラムを工夫する事により簡単に複数行の高さを変更する事が出来ます。まずは1行ずつ変更する方法を説明します。row_dimensionsで列の幅を変更します。

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルの4行目の高さを変更してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
sheet.row_dimensions[4].height = 50
book.save("テスト11実行結果.xlsx")

プログラムを実行すると「テスト11実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみると4行目の行の高さが変更されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目の「sheet.row_dimensions[4].height = 50」で行の高さを変更しています。この場合は4行目の高さを50に変更しています。

◆5行目の「book.save(“テスト11実行結果.xlsx”)」は、作成したエクセルブックを「テスト11実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの行の高さを変更する 
#row_dimensionsで変更したい行と、高さを指定する
sheet.row_dimensions[行].height = 行高さ

エクセルの行の高さをまとめて変更する

図のようにあいうえお、かきくけこ、・・・が記述されている「テスト01.xlsx」というエクセルファイルの1~5行目の高さをまとめて変更してみます。

次のコードを実行してみましょう。

import openpyxl as xls
book = xls.load_workbook("テスト01.xlsx",data_only=True)
sheet = book.active
for i in range(1,6):
    sheet.row_dimensions[i].height = 40
book.save("テスト12実行結果.xlsx")

プログラムを実行すると「テスト12実行結果.xlsx」というエクセルファイルが新たに作成されて、ファイルを確認してみると1~5行目の高さが変更されています。この内容について一つずつ説明していきます。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「book = xls.load_workbook(“テスト01.xlsx”,data_only=True)」は、「テスト01.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆4行目と6行目の「for i in range(1,6): sheet.row_dimensions[i].height = 40」の部分は、繰り返しの構文であるfor文を使用して、行の高さの変更を繰り返し実行しています。

◆5行目の「book.save(“テスト12実行結果.xlsx”)」は、作成したエクセルブックを「テスト12実行結果.xlsx」という名前で保存しています。

まとめ
 エクセルの行の高さをまとめて変更する 
#行の高さをまとめて変更したい場合はfor文を使用して繰り返し実行で変更する。heightで高さを指定する。
for i in range(開始行,終了行の次の行):
    sheet.row_dimensions[i].height = 行高さ

openpyxlでセルの結合と解除

セルの結合と解除の方法です。

ファイル中の全てのセルの結合の解除

openpyxlを使うとセルの結合や解除が個別に出来ますが、まずはエクセルファイルの全てのセルの結合を解除する方法を説明します。エクセルファイルを自動で処理する時に邪魔になるのがセルの結合で、セルの結合がファイル中にあると、セルの指定や計算結果が予想外の数値になることがあります。自動で処理したい場合は、セルの結合は、なるべく使用しないようにしましょう。

次のコードを入力して実行してましょう。実行する前には事前に「結合解除前のファイル.xlsx」というエクセルファイルを準備して、幾つかのセルを結合しておいてください。

この説明で準備したエクセルファイルは、ファイル中に2つのシートを用意して、セルを下図のように結合しました。

import openpyxl as xls
import os

class excel_operate:
    def __init__(self, excel_dir):
        self.excel_dir = excel_dir
        self.workbook = xls.load_workbook(self.excel_dir)
        self.sheet_number = len(self.workbook.sheetnames)
        self.sheet_contains =  [self.workbook.worksheets[i] for i in range(self.sheet_number)]
        self.merged_cells_list = [self.sheet_contains[i].merged_cells.ranges for i in range(self.sheet_number)]

    def get_merged_cells_location(self):
        self.merged_cells_location_list = [""]*self.sheet_number
        for i in range(self.sheet_number):
            self.merged_cells_location_list[i] = [format(self.merged_cells_list[i][j]) for j in range(len(self.merged_cells_list[i]))]

    def break_merged_cells(self):
        for i in range(self.sheet_number):
            for j in range(len(self.merged_cells_list[i])):
                self.sheet_contains[i].unmerge_cells(self.merged_cells_location_list[i][j])

path = os.getcwd() + "\\"
Excel = excel_operate(path + "結合解除前のファイル.xlsx")
Excel.get_merged_cells_location()
Excel.break_merged_cells()
Excel.workbook.save("解除済みのファイル.xlsx")
Excel.workbook.close

プログラムを実行すると「解除済みのファイル.xlsx」が作成されて、ファイルの中を確認すると、全てのシートの全てのセルの結合が解除されています。

このファイル全体の結合の解除は、呪文の様なものとして、とりあえずこのサンプルプログラムを実行すれば良いとしてコピペして使用するのが効率的です。

まとめ
 ファイル中の全てのセルの結合の解除 
#サンプルプログラムをコピペして使用しましょう!

merge_cells(*) セルを結合する

セルの結合方法です。

openpyxlでセルを結合する事ができます。次のコードを入力して実行してみましょう。

import openpyxl as xls
from openpyxl.styles import PatternFill

book = xls.Workbook()
sheet = book.active
sheet["A1"] = "あいうえお"
sheet["C5"] = "かきくけこ"
sheet.cell(row=1,column=1).fill = PatternFill(fill_type='solid',fgColor='F06060')
sheet.cell(row=5,column=3).fill = PatternFill(fill_type='solid',fgColor='60F060')

sheet.merge_cells(start_row=1,start_column=1,end_row=2, end_column=2)
sheet.merge_cells('C5:D6')

book.save("test18実行結果.xlsx")

プログラムを実行すると「test18実行結果.xlsx」が作成されて、ファイルの中を確認すると、次のようにセルが結合されています。セルは結合が分かりやすくするために着色しています。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆2行目の「from openpyxl.styles import PatternFill」は、ライブラリをインポートして、セルに着色が出来るようにしています。

◆4行目の「book = xls.Workbook()」は新規のエクセルブックを作成しています。

◆5行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

◆6,7行目の「sheet[“A1”] = “あいうえお”」「sheet[“C5”] = “かきくけこ”」は、A1セルとC5セルに、”あいうえお”と、”かきくけこ”という文字列を記入しています。

◆8,9行目は、実行結果を分かりやすくするためにセルに赤色と緑色の着色を行っています。

11,12行目でセルを結合しています。結合するセルの指定方法として、行番号および列番号を指定する方法と、セル名称を指定する方法、の2種類を使用しています。

◆14行目の「book.save(“test18実行結果.xlsx”)」は、作成したエクセルブックを「test18実行結果.xlsx」という名前で保存しています。

まとめ
 セルを結合する 
#結合するセルの指定方法として、行番号および列番号を指定する方法と、セル名称を指定する方法、の2種類がある。
sheet.merge_cells(start_row=開始行番号,start_column=開始列番号,end_row=終了行番号, end_column=終了列番号)
sheet.merge_cells('開始セル名:終了セル名')

unmerge_cells(*) セルの結合を解除する

セルの結合を解除する方法です。

openpyxlでセルの結合を解除する事ができます。

次のコードを入力して実行してみましょう。セルの結合を解除するプログラムをテストするには、既にセルが結合されたエクセルファイルが必要です。ここでは1つ前に実行した、セルの結合で作成された「test18実行結果.xlsx」のファイルを事前に準備しておいてください。プログラムを実行する前は図のようにセルが結合されています。

import openpyxl as xls

book = xls.load_workbook("test18実行結果.xlsx")
sheet = book.active
sheet.unmerge_cells(start_row=1,start_column=1,end_row=2, end_column=2)
sheet.unmerge_cells('C5:D6')

book.save("test19実行結果.xlsx")

プログラムを実行すると「test19実行結果.xlsx」が作成されて、ファイルの中を確認すると、次のようにセルの結合が解除されています。

◆1行目の「import openpyxl as xls」は、ライブラリをインポートして「xls」という名称で使用できるようにしています。

◆3行目の「book = xls.load_workbook(“test18実行結果.xlsx”)」は、「test18実行結果.xlsx」という名前のエクセルファイルを読み込んでいます。

◆3行目の「sheet = book.active」は、これから操作しようとしているシートを取得します。具体的にはファイルを開いてすぐに表示されるシート=アクティブなシートを取得しています。

5,6行目でセルの結合を解除しています。解除するセルの指定方法として、行番号および列番号を指定する方法と、セル名称を指定する方法、の2種類を使用しています。

◆8行目の「book.save(“test19実行結果.xlsx”)」は、作成したエクセルブックを「test19実行結果.xlsx」という名前で保存しています。

まとめ
 セルの結合を解除する 
#解除するセルの指定方法として、行番号および列番号を指定する方法と、セル名称を指定する方法、の2種類がある。
sheet.unmerge_cells(start_row=開始行番号,start_column=開始列番号,end_row=終了行番号, end_column=終了列番号)
sheet.unmerge_cells('開始セル名:終了セル名')