【问题标题】:Multiple NamedStyle in a single excel sheet - Python openpyxl单个 Excel 工作表中的多个 NamedStyle - Python openpyxl
【发布时间】:2018-11-06 16:07:44
【问题描述】:

我正在尝试为 Excel 工作表中的多个单元格设置样式。工作表中有多个表格。表格标题有粗体和正常边框,而表格数据只有顺序。

我已定义 2 NamedStyle 并附加到工作簿。但是当单元格的样式出现错误时。

book.add_named_style(tableHeaderStyle)
File "C:\Users\bsingh\AppData\Local\Programs\Python\Python36-32\lib\site-packages\openpyxl\workbook\workbook.py", line 303, in add_named_style
    self._named_styles.append(style)
File "C:\Users\bsingh\AppData\Local\Programs\Python\Python36-32\lib\site-packages\openpyxl\styles\named_styles.py", line 194, in append
    raise ValueError("""Style {0} exists already""".format(style.name))
ValueError: Style TableHeaderStyle exists already

代码:

from openpyxl.styles import Border, Side, Color, PatternFill, Font, Alignment, NamedStyle
my_border = Border(left=Side(border_style='thin', color='000000'),
                right=Side(border_style='thin', color='000000'),
                top=Side(border_style='thin', color='000000'),
                bottom=Side(border_style='thin', color='000000'))

normalBorderStyle = NamedStyle(name="NormalBorderStyle",
                           alignment=Alignment(horizontal='center', vertical='center', wrap_text=True), border=my_border)

tableHeaderStyle = NamedStyle(name="TableHeaderStyle", alignment=Alignment(horizontal='center', vertical='center'), border=my_border, \
                               font=Font(bold=True), \
                                fill=PatternFill(patternType='solid', fill_type='solid', fgColor=Color('C4D79B')))

#This function is called for a table in worksheet "ws" with the cell range as the start and end column of table "B3:G7".
def set_border(ws, cell_range):
    flag = 0
    for row in ws.iter_rows(cell_range):
        for cell in row:
            cell.style = "NormalBorderStyle"
            if flag ==0 :
                cell.border = "TableHeaderStyle"
        flag = 1

book = load_workbook(xlsfile)
book.add_named_style(tableHeaderStyle)
book.add_named_style(normalBorderStyle)
ws_active = book.get_sheet_by_name("Summary")
set_border(ws_active, "B3:G7")

【问题讨论】:

  • 请提供完整的回溯。
  • @CharlieClark 请在跟踪下方找到: book.add_named_style(tableHeaderStyle) File "C:\Users\bsingh\AppData\Local\Programs\Python\Python36-32\lib\site-packages\openpyxl \workbook\workbook.py”,第 303 行,在 add_named_style self._named_styles.append(style) 文件“C:\Users\bsingh\AppData\Local\Programs\Python\Python36-32\lib\site-packages\openpyxl\ styles\named_styles.py", line 194, in append raise ValueError("""Style {0} exists already""".format(style.name)) ValueError: Style TableHeaderStyle exists already
  • 请在您的问题中添加回溯,使其更易于阅读。
  • @CharlieClark 是的,更新了问题,5 分钟后无法更新评论。

标签: excel python-3.x pandas openpyxl


【解决方案1】:

您只需要注册一次样式,因此您可以使用下面给出的条件添加它。

if 'NormalBorderStyle' not in book.style_names:
    book.add_named_style(normalBorderStyle)

# Directly Use as:
ws['D5'].style = 'NormalBorderStyle'

https://openpyxl.readthedocs.io/en/stable/styles.html

【讨论】:

    【解决方案2】:

    看起来很像您正在加载的书中已经存在的样式,因为异常与您的功能无关。您可能想使用book.named_styles 添加支票。

    【讨论】:

    • 是的,这本书有一个命名风格。但是我尝试删除工作表并再次添加它,但仍然出现错误。我是否必须从整个工作簿中删除命名样式,或者如果有任何此类选项,我可以将其从工作表中删除?
    • 命名样式是每个工作簿的,例外是正确的,因为您正在尝试创建重复的样式。样式是可编辑的,但我总是建议使用不同的名称而不是编辑默认样式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2023-03-30
    • 2015-09-20
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多