Python Excel操作 逆引き集 | 書き込み開始セルを指定

Python
スポンサーリンク

何をするオプションなのかを一言でいうと

startrow=startcol= は、
「DataFrame を Excel に書き出すとき、どのセルから書き始めるか」を指定するためのオプションです。

行は 0 始まりで数えるので、
startrow=0 → 1 行目
startrow=1 → 2 行目

列も 0 始まりで、
startcol=0 → A 列
startcol=1 → B 列
startcol=2 → C 列

という対応になります。

「テンプレートのヘッダーを残して、2 行目から書きたい」
「左に余白を空けて、B 列から書きたい」
といったときに使います。


一番シンプルな例で動きをつかむ

行だけずらして書き出す startrow の基本

まずは DataFrame を用意します。

import pandas as pd

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

普通に書くとこうです。

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

Excel 上では、

1 行目:ヘッダー(「日付」「商品」「金額」)
2 行目以降:データ

という配置になります。

ここで、2 行目から書き始めたい場合はこうします。

df.to_excel("out_startrow.xlsx", index=False, startrow=1)
Python

このときの Excel は、

1 行目:空行(何も書かれない)
2 行目:ヘッダー
3 行目以降:データ

という形になります。

「上に 1 行空けたい」「テンプレートのタイトル行を残したい」といったときに、この感覚が効いてきます。


テンプレートにデータだけ流し込むパターン

既存のヘッダーを活かして 2 行目からデータを書く

よくあるのが、「会社指定の Excel テンプレート」があって、
1 行目にすでにヘッダーが書かれているケースです。

テンプレートの 1 行目がこうだとします。

A列B列C列
日付商品金額

このテンプレートに対して、2 行目以降に DataFrame の中身だけを書き込みたい。

その場合は、header=Falsestartrow=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 行目から書き始める(0 始まりなので 1)
    )
Python

ここでのポイントは、

1 行目のヘッダーはテンプレート側に任せる
2 行目から DataFrame のデータだけを流し込む

という役割分担を、header=Falsestartrow=1 で実現していることです。


列方向にずらして書く startcol の基本

B 列から書き始める例

同じ DataFrame を、A 列ではなく B 列から書きたい場合。

df.to_excel("out_startcol.xlsx", index=False, startcol=1)
Python

Excel 上では、

B 列:ヘッダーとデータ
A 列:空のまま

という配置になります。

A 列に手入力の項目を残したい
左側に余白を空けて見やすくしたい

といったときに、startcol が効いてきます。

行と列を両方ずらす

例えば、「2 行目・B 列から書きたい」ならこうです。

df.to_excel(
    "out_startrow_col.xlsx",
    index=False,
    startrow=1,  # 2 行目
    startcol=1   # B 列
)
Python

Excel のイメージは、

1 行目:何も書かれない
2 行目:B 列からヘッダー
3 行目以降:B 列からデータ

という形になります。


複数の表を 1 シートに並べる応用

上に集計、下に明細を縦に並べる

1 つのシートに「上部に集計」「下部に明細」を縦に並べたいとします。

import pandas as pd

summary = pd.DataFrame({
    "項目": ["件数", "合計金額"],
    "値": [10, 123456]
})

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

with pd.ExcelWriter("report.xlsx") as writer:
    summary.to_excel(writer, sheet_name="レポート", index=False, startrow=0)
    detail.to_excel(writer, sheet_name="レポート", index=False, startrow=5)
Python

ここでは、

0 行目(1 行目)から summary を書く
5 行目(6 行目)から detail を書く

という指定をしています。

startrow=5 の位置は、自分で「上の表が何行使うか」を見積もって決めます。
実際には、len(summary) + 2 のように計算してもよいです。

左右に表を並べる(横に並べる)

同じシートに、左に A 表、右に B 表を並べたい場合。

with pd.ExcelWriter("report_side_by_side.xlsx") as writer:
    summary.to_excel(writer, sheet_name="レポート", index=False, startrow=0, startcol=0)  # A 列
    detail.to_excel(writer, sheet_name="レポート", index=False, startrow=0, startcol=5)  # F 列あたり
Python

こうすると、A 列から summary、F 列から detail が始まる形になります。
「1 シートに複数の表をレイアウトする」感覚で使えるのが、startrowstartcol のおもしろいところです。


0 始まりの数え方に慣れる

行番号・列番号の対応を頭に入れておく

行は 0,1,2,… が Excel の 1,2,3,… に対応します。
列は 0,1,2,… が A,B,C,… に対応します。

よく使う位置だけ、感覚で覚えてしまうと楽です。

1 行目にタイトル、2 行目にヘッダー、3 行目からデータ
→ ヘッダーを書きたいなら startrow=1
→ データだけ書きたいなら startrow=2

A 列に余白を空けて、B 列から表を始めたい
startcol=1

この「0 を足す/引く」感覚に一度慣れてしまえば、あとは直感的に置けるようになります。


小さな練習アイデア

自分で小さな DataFrame を作って、

1 回目は普通に to_excel
2 回目は startrow=1
3 回目は startcol=2
4 回目は startrow=3, startcol=3

のように書き出して、Excel 上で「どこに出たか」を目で確認してみてください。

「ここに置きたい」を頭でイメージして、startrow / startcol に変換する練習をすると、
テンプレートへの書き込みや、複数表のレイアウトが一気に自由になります。

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