Skip to main content

Python Pandas: How to Add a Sheet to an Existing Excel File with Python Pandas

Adding a new worksheet to an existing Excel file without losing existing sheets requires using ExcelWriter in append mode. This preserves all current data while adding new content.

Prerequisites​

Install the openpyxl engine for Excel file handling:

pip install openpyxl

Append a New Sheet​

Use mode='a' (append) with ExcelWriter:

import pandas as pd

# Create data for new sheet
df = pd.DataFrame({
'Product': ['Widget', 'Gadget'],
'Sales': [100, 150]
})

# Append to existing Excel file
with pd.ExcelWriter('report.xlsx', mode='a', engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='Q1_Sales', index=False)

The existing sheets remain intact, and Q1_Sales is added.

Adding Multiple Sheets​

import pandas as pd

df1 = pd.DataFrame({'A': [1, 2, 3]})
df2 = pd.DataFrame({'B': [4, 5, 6]})

with pd.ExcelWriter('data.xlsx', mode='a', engine='openpyxl') as writer:
df1.to_excel(writer, sheet_name='Sheet_A', index=False)
df2.to_excel(writer, sheet_name='Sheet_B', index=False)

Handling Existing Sheet Names​

When a sheet name already exists, control the behavior with if_sheet_exists:

import pandas as pd

df = pd.DataFrame({'Updated': ['data', 'here']})

with pd.ExcelWriter('report.xlsx', mode='a', engine='openpyxl',
if_sheet_exists='replace') as writer:
df.to_excel(writer, sheet_name='Summary', index=False)

Options for if_sheet_exists​

OptionBehavior
'error'Raise ValueError (default)
'replace'Overwrite the existing sheet
'new'Create new sheet with numeric suffix (Sheet1, Sheet2...)
'overlay'Write on top of existing data (Pandas 1.4+)
import pandas as pd

# Create unique sheet name automatically
with pd.ExcelWriter('data.xlsx', mode='a', engine='openpyxl',
if_sheet_exists='new') as writer:
df.to_excel(writer, sheet_name='Report', index=False)
# If 'Report' exists, creates 'Report1'
warning

The if_sheet_exists parameter requires Pandas 1.3 or later. Earlier versions will raise an error if the sheet name exists.

Creating File If It Doesn't Exist​

Handle both new and existing files:

import pandas as pd
import os

filepath = 'report.xlsx'
df = pd.DataFrame({'Data': [1, 2, 3]})

# Check if file exists
if os.path.exists(filepath):
mode = 'a' # Append to existing
else:
mode = 'w' # Create new file

# if_sheet_exists only valid in append mode
writer_kwargs = {'mode': mode, 'engine': 'openpyxl'}
if mode == 'a':
writer_kwargs['if_sheet_exists'] = 'replace'

with pd.ExcelWriter(filepath, **writer_kwargs) as writer:
df.to_excel(writer, sheet_name='Results', index=False)

Reusable Function​

import pandas as pd
import os

def save_to_excel(df, filepath, sheet_name, if_exists='replace'):
"""Save DataFrame to Excel, creating file or appending sheet."""
mode = 'a' if os.path.exists(filepath) else 'w'

with pd.ExcelWriter(
filepath,
mode=mode,
engine='openpyxl',
if_sheet_exists=if_exists if mode == 'a' else None
) as writer:
df.to_excel(writer, sheet_name=sheet_name, index=False)

# Usage
df = pd.DataFrame({'Sales': [100, 200]})
save_to_excel(df, 'report.xlsx', 'January')
save_to_excel(df, 'report.xlsx', 'February')

Common Errors​

FileNotFoundError with mode='a'​

# ❌ Error: File must exist for append mode
with pd.ExcelWriter('nonexistent.xlsx', mode='a') as writer:
df.to_excel(writer)

# ✅ Check first or use try/except

Missing Engine​

# ❌ May fail without explicit engine
with pd.ExcelWriter('file.xlsx', mode='a') as writer:
df.to_excel(writer)

# ✅ Always specify engine for append mode
with pd.ExcelWriter('file.xlsx', mode='a', engine='openpyxl') as writer:
df.to_excel(writer)

Quick Reference​

GoalCode
Add new sheetmode='a', engine='openpyxl'
Replace existing sheetif_sheet_exists='replace'
Auto-rename if existsif_sheet_exists='new'
Raise error if existsif_sheet_exists='error' (default)

Summary​

  • Use pd.ExcelWriter(path, mode='a', engine='openpyxl') to add sheets to existing Excel files while preserving other sheets.
  • Control behavior for existing sheet names with if_sheet_exists
  • Use 'replace' to overwrite or 'new' to create uniquely named sheets.

Always verify the file exists before using append mode.