Python PR

【Python】Excelファイルを書き込む方法

記事内に商品プロモーションを含む場合があります

この記事では、PythonでExcelファイルを書き込む方法を解説します。

他の形式のファイルを扱うには以下の記事を参照してください。

また、Excelファイルを読み込む方法は以下の記事を参照してください。

Excelファイルを読み込む方法

ライブラリのインストール

PythonでExcelファイルを読み込むには、pandasを使います。まだ、インストールしてない方は以下のようにインストールしましょう!

$ pip install pandas

依存関係としてopenpyxlも必要となります。

$ pip install openpyxl

インポート

ソースコードの先頭でpandasをインポートします。

import pandas as pd

asを使って「pd」と別名を付けて使用されることが多いです。

Excelファイルを書き込む

Excelファイルに書き込みたいデータをDataFrameオブジェクトとして準備します。

df = pd.DataFrame(
    [
        ['Bob', 24],
        ['Mike', 39],
    ],
)

次に、ExcelWriterクラスのインスタンスを生成します。
引数には書き込むファイルの名前(パス)を指定します。

writer = pd.ExcelWriter('test.xlsx')

そしたらDataFrame.to_excel()を使ってExcelシートに書き込みます。
引数には先ほど生成したExcelWriterオブジェクトを指定します。

df.to_excel(writer)

書き込みが終わったら生成したExcelWriterオブジェクトを閉じます。

writer.close()

最終的なコードは以下のような感じになります。

import pandas as pd

df = pd.DataFrame(
    [
        ['Bob', 24],
        ['Mike', 39],
    ],
)

writer = pd.ExcelWriter('test.xlsx')
df.to_excel(writer)

writer.close()

上記コードを実行すると同ディレクトリ内に以下のようなExcelファイルが生成されます。

ExcelWriterオブジェクトは後処理が必要なのでwith文で扱うとより安全です。

import pandas as pd

df = pd.DataFrame(
    [
        ['Bob', 24],
        ['Mike', 39],
    ],
)

writer = pd.ExcelWriter('test.xlsx')

with pd.ExcelWriter("test.xlsx") as writer:
    df.to_excel(writer)

indexやcolumnsの指定

DataFrameオブジェクトのindex引数やcolumns引数にあらかじめ任意の値を渡しておくことでindexやcolumnsを指定することができます。

import pandas as pd

df = pd.DataFrame(
    [
        ['Bob', 24],
        ['Mike', 39],
    ],
    index=[1000, 1001],
    columns=['name', 'age'], 
)

with pd.ExcelWriter("test.xlsx") as writer:
    df.to_excel(writer)

実行結果は以下のようになります。

indexやcolumnsを書き出したくない場合は、DataFrame.to_excel()index引数やheader引数にFalseを指定する。

import pandas as pd

df = pd.DataFrame(
    [
        ['Bob', 24],
        ['Mike', 39],
    ],
)

with pd.ExcelWriter("test.xlsx") as writer:
    df.to_excel(writer, index=False, header=False)

実行結果は以下のようになります。

シートの指定

DataFrame.to_excel()sheet_name引数にシート名を指定することで書き込むシートを変更することができます。

import pandas as pd

egg = pd.DataFrame(
    [
        ['美味しいたまご', 185],
        ['高いたまご', 500],
    ],
    columns=['name', 'price'], 
)

natto = pd.DataFrame(
    [
        ['ネバネバすぎる納豆', 159],
        ['匂う納豆', 289],
    ],
    columns=['name', 'price'], 
)

with pd.ExcelWriter("test.xlsx") as writer:
    egg.to_excel(writer, sheet_name='egg')      # シート名にegg
    natto.to_excel(writer, sheet_name='natto')  # シート名にnatto

以下のような2つのシートが生成され、データが書き込まれます。

追記

ExcelWriterオブジェクトのmode引数に'a'を指定することで追記モードでシートを書き込むことができます。

# test.xlsxにsheet2を追記
with pd.ExcelWriter("test.xlsx", mode='a') as writer:
    df2.to_excel(writer, sheet_name='sheet2')

既に存在するシートに書き込もうとする場合(シート名を指定しない際も同様)はif_sheet_exists引数を変更する必要がある。if_sheet_exists引数は既に存在するシートに書き込もうとする際の動作を定めています。

以下のような動作を指定可能です。

error ValueErrorを発生させる。
new エンジンによって決定された名前で新しいシートを作成します。
replace シートに書き込む前に、シートの内容を削除します。
overlay 古いコンテンツを削除せずに、既存のシートにコンテンツを書き込みます。

では、試しに'new'で追記してみます。

import pandas as pd

df1 = pd.DataFrame(
    [
        ['ABC', 123],
        ['DEF', 456],
    ], 
)

df2 = pd.DataFrame(
    [
        ['GHI', 789],
        ['JKL', 123],
    ],
)

# Excelファイルの生成
with pd.ExcelWriter("test.xlsx") as writer:
    df1.to_excel(writer)

# 追記
with pd.ExcelWriter("test.xlsx", mode='a', if_sheet_exists='new') as writer:
    df2.to_excel(writer)

以下のように新たにシートが追加され、データが書き込まれました。

同じシートに追記したい場合は、if_sheet_exists引数をoverlayに指定し、DataFrame.to_excel()startcol引数やstartrow引数で書き込み始める場所を指定します。

また、indexやcolumnsが邪魔ならindex引数やheader引数にFalseを指定しておきます。

import pandas as pd

df1 = pd.DataFrame(
    [
        ['ABC', 123],
        ['DEF', 456],
    ], 
)

df2 = pd.DataFrame(
    [
        ['GHI', 789],
        ['JKL', 123],
    ],
)

# Excelファイルの生成
with pd.ExcelWriter("test.xlsx") as writer:
    df1.to_excel(writer)

# 追記
with pd.ExcelWriter("test.xlsx", mode='a', if_sheet_exists='overlay') as writer:
    df2.to_excel(writer, startrow=3, header=False)

実行結果は以下のようになります。