まず「ヘッダーを出さない」とは何を意味するか
通常 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 はこうなります。
| date | product | amount |
|---|---|---|
| 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 を作って見比べる
df.to_excel("with_header.xlsx", index=False)df.to_excel("without_header.xlsx", index=False, header=False)
この2つを Excel で開いて、
「どちらがどういう用途に向いていそうか」を自分の目で確認してみてください。
最後に
header=False は、
「この Excel には、列名を書かずにデータだけ並べたい」という意思表示です。
特に、
テンプレートにすでにヘッダーがある
システム連携用に“ヘッダーなしデータ”が必要
インデックスもヘッダーもいらない“生データ表”を作りたい
といった場面で、index=False とセットで使うと威力を発揮します。
「この Excel を開くのは誰か?」「その人は列の意味をどこで知るか?」
そこまでイメージしながら、header=True/False を選べるようになると、
ただ書き出すだけじゃない“気の利いた Excel 出力”ができるようになります。
