何をするオプションなのかを一言でいうと
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)
PythonExcel 上では、
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=False と startrow=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=False と startrow=1 で実現していることです。
列方向にずらして書く startcol の基本
B 列から書き始める例
同じ DataFrame を、A 列ではなく B 列から書きたい場合。
df.to_excel("out_startcol.xlsx", index=False, startcol=1)
PythonExcel 上では、
B 列:ヘッダーとデータ
A 列:空のまま
という配置になります。
A 列に手入力の項目を残したい
左側に余白を空けて見やすくしたい
といったときに、startcol が効いてきます。
行と列を両方ずらす
例えば、「2 行目・B 列から書きたい」ならこうです。
df.to_excel(
"out_startrow_col.xlsx",
index=False,
startrow=1, # 2 行目
startcol=1 # B 列
)
PythonExcel のイメージは、
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 シートに複数の表をレイアウトする」感覚で使えるのが、startrow と startcol のおもしろいところです。
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 に変換する練習をすると、
テンプレートへの書き込みや、複数表のレイアウトが一気に自由になります。
