Python Excel操作 逆引き集 | 書き込み時にヘッダーを出力しない

Python
スポンサーリンク

まず「ヘッダーを出さない」とは何を意味するか

通常 DataFrame.to_excel() を呼ぶと、
1行目に「列名(カラム名)」が書き出されます。これが ヘッダー行 です。

header=False は、
「このヘッダー行を Excel に書かないでほしい」
という指定です。

つまり、1行目からいきなりデータだけが並ぶ Excel を作りたいときに使います。


基本形:to_excel(…, header=False) の挙動

まずはデフォルト(header=True)の動きを確認する

import pandas as pd

df = pd.DataFrame({
    "date": ["2025-01-01", "2025-01-02"],
    "product": ["りんご", "みかん"],
    "amount": [1000, 800]
})

df.to_excel("with_header.xlsx", index=False)
Python

この場合、Excel はこうなります。

dateproductamount
2025-01-01りんご1000
2025-01-02みかん800

1行目に date, product, amount という「列名」が出ています。
これがヘッダーです。

header=False を付けた場合

df.to_excel("without_header.xlsx", index=False, header=False)
Python

この場合、Excel はこうなります。

2025-01-01りんご1000
2025-01-02みかん800

1行目から、いきなりデータだけが並びます。
列名は一切出力されません。

ここが header=False の一番大事な効果 です。


どんなときに header=False を使うのか

すでにテンプレート側にヘッダーがあるとき

現場でよくあるのが、「会社指定の Excel テンプレート」があるパターンです。

テンプレートの1行目には、すでにこんなヘッダーが書かれているとします。

日付商品金額

このテンプレートに対して、
「2行目以降にデータだけを書き込みたい」
というとき、header=False が効いてきます。

import pandas as pd

df = pd.DataFrame({
    "日付": ["2025-01-01", "2025-01-02"],
    "商品": ["りんご", "みかん"],
    "金額": [1000, 800]
})

with pd.ExcelWriter("template.xlsx", mode="a", engine="openpyxl") as writer:
    df.to_excel(
        writer,
        sheet_name="入力シート",
        index=False,
        header=False,
        startrow=1  # 2行目から書き始める(0始まりなので1)
    )
Python

ここでは、

1行目:テンプレート側のヘッダー(すでに存在)
2行目以降:Pythonから書き込んだデータ(header=False で列名なし)

という構成になります。

別ツールが「ヘッダーなしのデータ」を前提にしているとき

たとえば、あるシステムが
「1行目からデータが入っている CSV/Excel を読み込む」
という仕様になっている場合。

そのシステムに渡すための中間ファイルを Python で作るなら、
header=False で「ヘッダーなしの表」を出力する必要があります。

df.to_excel("for_system.xlsx", index=False, header=False)
Python

このファイルを、そのままシステムに食わせるイメージです。


index=False と header=False をセットで考える

「余計な行・列を一切出さない」形

人やシステムに渡す“きれいなデータ”を作るとき、
よく使う組み合わせがこれです。

df.to_excel("clean.xlsx", index=False, header=False)
Python

この場合、Excel はこうなります。

2025-01-01りんご1000
2025-01-02みかん800

左端にインデックス列なし(index=False)
1行目にヘッダー行なし(header=False)

つまり、「純粋にデータだけが並んだ表」になります。

「ヘッダーはテンプレート側にある」
「読み込む側が列の意味を知っている」
といった状況では、この形がとても便利です。


実践テンプレート

テンプレ1:テンプレートのヘッダーを活かして、2行目以降にデータだけ書く

テンプレート template.xlsx の「入力」シートに、
すでに1行目のヘッダーがあるとします。

import pandas as pd

df = pd.DataFrame({
    "日付": ["2025-01-01", "2025-01-02"],
    "商品": ["りんご", "みかん"],
    "金額": [1000, 800]
})

with pd.ExcelWriter("template.xlsx", mode="a", engine="openpyxl") as writer:
    df.to_excel(
        writer,
        sheet_name="入力",
        index=False,
        header=False,
        startrow=1  # 2行目から書き込む
    )
Python

このテンプレートは、「ヘッダーは人間が整えたものを使い、データだけ Python から流し込む」という典型パターンです。

テンプレ2:システム連携用に「ヘッダーなしのデータファイル」を作る

import pandas as pd

df = pd.read_excel("sales_raw.xlsx")

df = df[["日付", "商品コード", "数量", "金額"]]

df.to_excel(
    "sales_for_system.xlsx",
    index=False,
    header=False
)
Python

ここでは、

列の順番だけ整える
ヘッダーもインデックスも出さない
純粋なデータだけを渡す

という形にしています。


つまずきやすいポイントと注意点

header=False にすると「列名情報」はファイルに残らない

当たり前ですが、ヘッダーを出さないということは、
Excel ファイル側には「列名」が一切書かれません。

後からこのファイルを pandas で読むときは、
header=None で「ヘッダー行はない」と宣言する必要があります。

df2 = pd.read_excel("sales_for_system.xlsx", header=None)
Python

必要なら、読み込み時に names=[...] で列名を付け直すことになります。

人間が見るファイルなら、基本は header=True の方が親切

人に渡すレポートや、誰かが直接開いて見る Excel なら、
ヘッダーがないと「この列何?」となります。

なので、

人が見るレポート → header=True(デフォルト)
テンプレートにヘッダーがある/システム連携用 → header=False

という使い分けを意識しておくとよいです。


小さな練習問題

練習1:header あり/なしの Excel を作って見比べる

  1. df.to_excel("with_header.xlsx", index=False)
  2. df.to_excel("without_header.xlsx", index=False, header=False)

この2つを Excel で開いて、
「どちらがどういう用途に向いていそうか」を自分の目で確認してみてください。


最後に

header=False は、
「この Excel には、列名を書かずにデータだけ並べたい」という意思表示です。

特に、

テンプレートにすでにヘッダーがある
システム連携用に“ヘッダーなしデータ”が必要
インデックスもヘッダーもいらない“生データ表”を作りたい

といった場面で、index=False とセットで使うと威力を発揮します。

「この Excel を開くのは誰か?」「その人は列の意味をどこで知るか?」
そこまでイメージしながら、header=True/False を選べるようになると、
ただ書き出すだけじゃない“気の利いた Excel 出力”ができるようになります。

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