The error message "AttributeError: 'MergedCell' object attribute 'value' is read-only," indicates that we are trying to modify the value of a merged cell using the value attribute in the openpyxl library for working with Excel files. However, the value attribute for merged cells is read-only, meaning you cannot directly set or modify its value.

Here's a detailed solution to address this error:

Understanding Merged Cells:
Merged cells in Excel are those cells that span across multiple rows and/or columns. When you access a merged cell in openpyxl, you are given a MergedCell object.

Read-only Attribute: 
The error message specifically mentions that the value attribute of a MergedCell object is read-only. This means you cannot assign a new value directly to it using the value attribute.

To modify the value of a merged cell, you need to access the individual cells that make up the merged cell and set their values. Here's example code how you can do it:
  1. Load the Excel workbook.
  2. Select the worksheet.
  3. Access the merged cell.
  4. Unmerge the cell.
  5. Set the value of the individual cells.
  6. Save the workbook.
from openpyxl import load_workbook

# Load the Excel workbook
wb = load_workbook('excel_file.xlsx')

# Select the worksheet
ws = wb['Sheet1']  

# Access the merged cell
merged_cell = ws['A1']  # Assuming 'A1' is our merged cell

# Unmerge the cell
ws.unmerge_cells('A1')  # This code will unmerge the cell

# Set the value of the individual cells
ws['A1'] = 'New Value'  # Set the value of the first cell in the merged range

# Save the workbook'updated_excel_file.xlsx')

  • We first load the Excel workbook and select the appropriate worksheet.Then, we access the merged cell using its coordinates (e.g., 'A1').
  • We unmerge the cell using unmerge_cells() method.
  • After unmerging, we can set the value of the individual cells that were previously merged.

How to merge cells in openpyxl and handle the situation where the merged cells may contain border information

When we merge cells, we remove all cells except the top-left one from the worksheet. To retain the border information of the merged cell, we create boundary cells as MergeCells, which always have the value 'None'.
top_left_cell = ws['A2']
top_left_cell.value = "Cell"

Then, we merge cells from A2 to E4 using ws.merge_cells('A2:E4'). After merging, we access the top-left cell of the merged range using top_left_cell = ws['A2']. Finally, we set the value of this cell to "Cell" using top_left_cell.value = "Cell".

By creating MergeCells for the boundary cells, the border information is retained even after merging.

However, it's important to note that while this solution works well for setting the value of the top-left cell, it doesn't address setting values for the other cells in the merged range. If you need to set values for those cells as well, you would need to access and modify each individual cell within the merged range separately.
The correct English phrasing for your error message would be:

"AttributeError: 'MergedCell' object's attribute 'value' is read-only when attempting to append a DataFrame to an existing Excel sheet."

# Load existing workbook
wb = load_workbook(filename)

# Get the active sheet
ws =

# Find the next empty row in the "ProductSheet"
next_row = ws.max_row + 1

# Write DataFrame to the "DR Sheet" starting from the next empty row
with pd.ExcelWriter(filename, mode='a', engine='openpyxl') as writer: = wb
    writer.sheets = {ws.title: ws}
    final_df.to_excel(writer, sheet_name="ProductSheet", header=None, startrow=next_row)

# Save the workbook
  • We load the existing Excel workbook using load_workbook and then get the active sheet from the workbook.
  • We find the next empty row in the "ProductSheet" using ws.max_row.
  • We write the DataFrame to the "ProductSheet" starting from the next empty row using startrow=next_row.
  • We save the workbook after appending the DataFrame.
Above approach ensures that the DataFrame is appended to the Excel sheet without encountering the "MergedCell" read-only attribute error.