よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

OpenPyXLでExcelファイルに書き込む その1

今回はOpenPyXLでExcelファイルに書き込みを行います。

前回まで参照

PandasでExcelファイルを読む - よちよちpython
PandasでExcelファイルに書き込む - よちよちpython
OpenPyXLでExcelファイルを読み取る - よちよちpython

作業環境

  • PC

    • Windows10
    • Anaconda
    • Jupyter Notebook
    • python3.7
  • スマホ

準備

モジュールのインストール確認

import openpyxl

を実行して、ModuleNotFoundErrorが出なければインストール済み。

まだインストールがお済みでなかったら

$ pip install openpyxl

これで準備完了です。

参考
OpenPyXL公式

注意

Pythonで読み書きの実行をする時にブックが開いたままですとエラーが出ますので、確認後は毎回ブックを閉じてください。


目次




新規ワークブックのオブジェクト作成

空のワークブックのオブジェクトを新規作成します。
save()メソッドを使うまでは保存されません。

import openpyxl

wb = openpyxl.Workbook()

シート名を取得

wb.sheetnames
['Sheet']

wb.get.sheet_names()は非推奨です。エラーが出るかと思います。

デフォルトで「Sheet」という名前のシートが1つだけ新規作成されるようです。


アクティブシートを変数に格納

sheet = wb.active

実行結果は表示されません。
アクティブになっているはず。


アクティブシートのシート名取得

sheet.title
'Sheet'

アクティブなシートのシート名が取得できた。


シート名の変更と取得

日本語でシート名を入れてみます。「1枚目」とします。

続けて変更したシート名の取得も行います。

sheet.title = "1枚目"  
  
wb.sheetnames
['1枚目']

OK。シート名が日本語のものに変更できました。たぶん・・・
未確認で突き進む。


Excelファイルの新規作成

上記で

  1. 新規ワークブックのオブジェクト作成
  2. シート名を取得
  3. シートをアクティブにする
  4. アクティブシートのシート名取得
  5. シート名の変更と取得

までを行いました。現時点ではsave()を使っていませんので何も保存されていない状態です。

シート名「1枚目」で内容が空の workbookオブジェクト= wb をsave()で保存すればファイルが新規作成されます。
保存するExcelファイル名を、こちらも日本語でやってみます。「書き込みテスト.xlsx」としておきます。

wb.save("書き込みテスト.xlsx")

実行は表示されません。
カレントディレクトリにExcelファイルが新規作成されたことをエクスプローラーで確認しました。

確認のため、シート名とシートの中身をPythonで読み取ってみます。

# Excelファイルを読み込む
file_name = "書き込みテスト.xlsx"
wb = openpyxl.load_workbook(file_name)

# シート名取得
sheet_name = wb.sheetnames 
print(sheet_name)
['1枚目']

シートが新規作成されている模様。

中身を読んでみます。

 # アクティブシートを変数に格納
sheet = wb.active

# アクティブシートの内容を行オブジェクトで取得
sheet.rows
()

シート名は取得できたが、内容は空だったので「()」で表示されました。



シートを追加

シートを追加し、保存します。

# シート追加
wb.create_sheet()
wb.save(file_name)

実行は表示されません。
たぶん作られた。

シート名を取得します。

# シート名取得
sheet_name = wb.sheetnames 
print(sheet_name)
['1枚目', 'Sheet']

2枚目に「Sheet」というデフォルトの新規シート名でシートが新規作成されました。


シート名を指定して名前を変更する

追加したシートのシート名を変更してみる。

wb["Sheet"].title = "2枚目"

全シート名を取得する。

print(wb.sheetnames)
['1枚目', '2枚目']

グッジョブ。


シート名を指定して追加

シート名をつけて3枚目の新規シートを追加してみます。
シート追加するには create_sheet() を使いましたが、indextitleを指定して追加も可能。

wb.create_sheet(index = 2, title = "3枚目")
wb.save(file_name)

シート名を確認します。

# シート名取得
sheet_name = wb.sheetnames 
print(sheet_name)
['1枚目', '2枚目', '3枚目']




シートを削除

シートを削除するには remove_sheet() メソッドを使います。
remove_sheet()メソッドはWorksheetオブジェクトを引数に取ります。
Worksheetオブジェクトはwb[シート名]です。 wb.get_sheet_by_name("Sheet1")は 非推奨です。

シート名からシートを削除する場合は以下のようにします。

#wb.remove_sheet(wb["3枚目"])

実行しましたらDeprecationWarning: の警告が出ました!!またか!!

C:\Users\ユーザー名\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: DeprecationWarning: Call to deprecated function remove_sheet (Use wb.remove(worksheet) or del wb[sheetname]). """Entry point for launching an IPython kernel.

remove_sheet の代わりに wb.remove(worksheet)del wb[sheetname] を使いたまえ、と。

はい。
順番が前後しますが del wb[sheetname]から。

# シート全取得
print("削除前 ",wb.sheetnames)

# 3枚目を削除する
sheet_name = wb.sheetnames[2]
del wb[sheet_name]

# 削除を保存
wb.save(file_name)

# シート全取得
print("削除後 ",wb.sheetnames)
削除前  ['1枚目', '2枚目', '3枚目']
削除後  ['1枚目', '2枚目']

save()をしないと変更が保存されません。

# シート全取得
print("削除前 ",wb.sheetnames)


# 2枚目を削除する

wb.remove(wb.worksheets[1])

# 削除を保存
wb.save(file_name)

# シート全取得
print("削除後 ",wb.sheetnames)
削除前  ['1枚目', '2枚目']
削除後  ['1枚目']




長いので一旦切ります。

つづきはこちら

OpenPyXLでExcelファイルに書き込む その2 - よちよちpython