Skip to content

XlsxWriter 'save' AttributeError

Problem Statement

A common error occurs when using Pandas with XlsxWriter to export DataFrames to Excel and add customizations like charts. Attempting to save the file with writer.save() triggers:

python
AttributeError: 'XlsxWriter' object has no attribute 'save'. Did you mean: '_save'?

This happens because pandas deprecated and removed the .save() method for ExcelWriter objects. Modern pandas versions (≈1.5.0+) no longer support save(), resulting in this AttributeError when using older code.

Correct Solutions

Use Python's with statement to automatically handle resource cleanup. The file saves correctly when exiting the block, eliminating manual closing.

python
import pandas as pd

df = pd.DataFrame({
    'Name': ['John', 'Jane', 'Adam'], 
    'Age': [25, 30, 35], 
    'Gender': ['M', 'F', 'M']
})

with pd.ExcelWriter("output.xlsx", engine="xlsxwriter") as writer:
    # Export DataFrame (disable index to avoid extra column)
    df.to_excel(writer, sheet_name="Sheet1", index=False)
    
    # Access workbook/worksheet objects
    workbook = writer.book
    worksheet = writer.sheets["Sheet1"]
    
    # Add chart referencing the 'Age' column (Column B)
    chart = workbook.add_chart({"type": "line"})
    chart.add_series({
        "values": "=Sheet1!$B$2:$B$4",  # Age values (B2-B4)
        "name":   "=Sheet1!$B$1",        # Series name from header (B1)
    })
    worksheet.insert_chart("D2", chart)

Key fixes:

  • Replaces writer.save() with context manager
  • Uses index=False to align data columns correctly
  • Corrects chart references (Sheet1!$B$X instead of Sheet1.$B$X)
  • Includes series name for clearer chart labeling

Alternative: Explicitly Close Writer

If not using a context manager, call .close() on the writer object:

python
writer = pd.ExcelWriter("output.xlsx", engine="xlsxwriter")
df.to_excel(writer, sheet_name="Sheet1", index=False)

workbook = writer.book
worksheet = writer.sheets["Sheet1"]

chart = workbook.add_chart({"type": "line"})
chart.add_series({
    "values": "=Sheet1!$B$2:$B$4",
    "name": "=Sheet1!$B$1"
})
worksheet.insert_chart("D2", chart)

writer.close()  # Use close() instead of save()

Why This Error Occurs

  • Deprecation Timeline
    Older pandas versions (≤1.4.x) raised a FutureWarning when using .save(), but it still worked. Recent versions (≥1.5.0) fully removed the method to enforce safer resource handling.

  • API Changes
    The .save() method was never part of pandas' public API. Its removal aligns with Python best practices for file I/O (using context managers or close()).

Best Practices for Excel Export

  1. Always use index=False
    Avoid unexpected misalignment of columns and chart data.

  2. Validate cell references
    Excel formulas in charts require ! notation (not.):
    =Sheet1!$B$2:$B$4 → Correct
    =Sheet1.$B$2:$B$4 → Incorrect (causes errors)

  3. Prefer context managers
    Guarantees files close properly, even if errors occur mid-execution.


::: success
Key Takeaway: Replace writer.save() with

  • writer.close() for explicit handling, or
  • Context manager (with pd.ExcelWriter(...)) for robust, automated file management.
    :::