Style Normal exists already – Python – OpenPyxl

Question:

I have looked into many stackoverflow questions but none of them seemed to solve my problem. I am using Python and Openpyxl to fill a whole row with red given a certain condition. I did all the importations necessary :

from openpyxl.styles import PatternFill, NamedStyle, Color
from openpyxl.styles.colors import RED

And my code is the following :

for cell in sheet[i]:
    cell.style = NamedStyle(fill=PatternFill(patternType='solid',
                                    fill_type='solid', 
                                    fgColor=Color(RED)))

When I ask to print the first occurence of cell it gives me

<Cell 'Divers'.A4> 

which is what I am looking for.
However, the following error comes every time : “Style Normal exists already”. There is absolutely no cell formatting or style whatsoever in the rest of the code but the Excel file cells are indeed filled with yellow already.

Any idea on how to solve this ? Thanks in advance for any help.

Asked By: pattes

||

Answers:

If using a NamedStyle, you’re required to pass a name.

red_foreground = NamedStyle(
    name="RedForeground",
    fill=PatternFill(
        patternType='solid',
        fill_type='solid', 
        fgColor=Color(RED)
    )
)

Since you’re assigning this NamedStyle to more than one cell, it makes sense to register it to your workbook.

wb.add_named_style(red_foreground)

Then you can update it’s application to cells, like so:

for cell in sheet[i]:
    cell.style = "RedForeground"

Reference:

Answered By: Oluwafemi Sule

I also have this problem, and finally found that it was because there were 2 styles, of which had the same name. This is usually caused when you use copy.copy(style). Then after change one of the style.name = 'newname', it will work.

Answered By: user10172107

This code would solve already existing named styles.

for index,cur_style in enumerate(excel_workbook._named_styles):
    if cur_style.name == 'my_new_style':
        excel_workbook._named_styles[index] = my_new_style
        my_new_style.bind(excel_workbook)
        break
else:
    excel_workbook.add_named_style(my_new_style)

However, in your case, you should use some other name than "Normal", because "Normal" is the default named style, just find another name and you can use the code I pasted

Answered By: hfuslu

There is another way to solve traceback by adding existing styles:

if not 'Style_A' in wb.named_styles:
    wb.add_named_style(Style_A)
Answered By: maxmyh
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.