Использование пользовательских стилей, определенных в Excel с openxyl - PullRequest
0 голосов
/ 04 марта 2019

С openpyxl вы можете использовать встроенные стили , определенные в Excel, например:

wb = load_workbook("My_Template.xlsx")
ws = wb["My_super_Worksheet"]

ws["B2"].value = '=Hyperlink("https://stackoverflow.com", "SO")'
ws["B2"].style = "Hyperlink"

Однако, как бы вы использовали пользовательские стили, определенныев файле Excel?Что-то, что могло бы выглядеть так:

wb = load_workbook("My_Template.xlsx")
ws = wb["My_super_Worksheet"]

wb.register_style("My_Custome_style")  # defined as custom style in My_Template.xlsx

ws["B2"].value = '=Hyperlink("https://stackoverflow.com", "SO")'
ws["B2"].style = ""My_Custome_style""

Единственный способ, который я нашел, это переопределить стили в вашей программе как Именованные стили и сохранить их, но это потребовало бы повторного определениястиль вместо повторного использования того, что уже существует.

Большое спасибо.

1 Ответ

0 голосов
/ 05 марта 2019

Существует обходной путь, который не отвечает на вопрос, но может помочь решить проблему.

  1. Установка формата в некоторых заданных ячейках (например, на листе под названием «СТИЛИ») *
  2. Извлечение всех стилей и регистрация их с помощью openpyxl
  3. Использование стилей с их именами

В Excel , что даст что-то вродеэто:

Styles defined in STYLES

В Python , вы можете добавить следующую функцию и вызвать ее:

from copy import copy
import logging
from openpyxl.styles import NamedStyle
from openpyxl.workbook import Workbook
from openpyxl.worksheet.worksheet import Worksheet
from typing import Dict

def _register_styles(wb:Workbook, ws_style: Worksheet) -> Dict[str, NamedStyle]:
    """Parse a column of cells and register the styles
    (the style names are the values of cells)

    Args:
        wb: The workbook
        ws_style: The worksheet with the styles defined

    Returns:
        Dictionary of styles, by names
    """
    list_styles = dict()  # type: Dict[str, NamedStyle]
    # Register styles of a config cells
    col, row = "A", 2
    cell = ws_style[col + str(row)]  # or in Python 3.6+: f"{col}{row}"
    while cell.value:
        style = NamedStyle(name=cell.value)
        style.font = copy(cell.font)
        style.fill = copy(cell.fill)
        style.border = copy(cell.border)
        style.alignment = copy(cell.alignment)
        style.number_format = copy(cell.number_format)

        try:
            wb.add_named_style(style)
        except ValueError as e:
            logging.warning("W006: style creation skipped because {}".format(e))
        list_styles[cell.value] = style

        row += 1
        cell = ws_style[col + str(row)]  # or in Python 3.6+: f"{col}{row}"

    return list_styles


wb = load_workbook("My_Template.xlsx")
_register_styles(wb, wb["STYLES"])

ПРИМЕЧАНИЕ: если вы используете Python до версии 3.4, просто удалите подсказки типа в начале прототипа функции: def _register_styles(wb, ws_style):

...