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ファイルの新規作成
上記で
- 新規ワークブックのオブジェクト作成
- シート名を取得
- シートをアクティブにする
- アクティブシートのシート名取得
- シート名の変更と取得
までを行いました。現時点では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()
を使いましたが、index
とtitle
を指定して追加も可能。
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枚目']
長いので一旦切ります。
つづきはこちら