from ._openxlsx import (
XLColor,
XLPatternType,
XLLineStyle,
XLAlignmentStyle,
)
[docs]
class Font:
def __init__(self, name="Arial", size=11, bold=False, italic=False, color=None):
self._name = name
self._size = size
self._bold = bold
self._italic = italic
if color:
if isinstance(color, str):
self._color = XLColor(color)
else:
self._color = color
else:
self._color = XLColor(0, 0, 0) # Default black
[docs]
def name(self):
return self._name
[docs]
def set_name(self, value):
self._name = value
[docs]
def size(self):
return self._size
[docs]
def set_size(self, value):
self._size = value
[docs]
def bold(self):
return self._bold
[docs]
def set_bold(self, value):
self._bold = value
[docs]
def italic(self):
return self._italic
[docs]
def set_italic(self, value):
self._italic = value
[docs]
def color(self):
return self._color
[docs]
def set_color(self, value):
if isinstance(value, str):
self._color = XLColor(value)
else:
self._color = value
[docs]
class Fill:
def __init__(
self, pattern_type=XLPatternType.Solid, color=None, background_color=None
):
if isinstance(pattern_type, str):
self._pattern_type = XLPatternType.Solid # Default fallback
for name, member in XLPatternType.__members__.items():
if name.lower() == pattern_type.lower():
self._pattern_type = member
break
else:
self._pattern_type = pattern_type
self._color = None
self._background_color = None
if color:
if isinstance(color, str):
self._color = XLColor(color)
else:
self._color = color
if background_color:
if isinstance(background_color, str):
self._background_color = XLColor(background_color)
else:
self._background_color = background_color
[docs]
def pattern_type(self):
return self._pattern_type
[docs]
def set_pattern_type(self, value):
self._pattern_type = value
[docs]
def color(self):
return self._color
[docs]
def set_color(self, value):
if isinstance(value, str):
self._color = XLColor(value)
else:
self._color = value
[docs]
def background_color(self):
return self._background_color
[docs]
def set_background_color(self, value):
if isinstance(value, str):
self._background_color = XLColor(value)
else:
self._background_color = value
[docs]
class Alignment:
def __init__(self, horizontal=None, vertical=None, wrap_text=False):
self._horizontal = None
self._vertical = None
self._wrap_text = wrap_text
if horizontal:
if isinstance(horizontal, str):
# Map string to enum
for name, member in XLAlignmentStyle.__members__.items():
if name.lower() == horizontal.lower():
self._horizontal = member
break
else:
self._horizontal = horizontal
if vertical:
if isinstance(vertical, str):
# Map string to enum
for name, member in XLAlignmentStyle.__members__.items():
if name.lower() == vertical.lower():
self._vertical = member
break
else:
self._vertical = vertical
[docs]
def horizontal(self):
return self._horizontal
[docs]
def set_horizontal(self, value):
self._horizontal = value
[docs]
def vertical(self):
return self._vertical
[docs]
def set_vertical(self, value):
self._vertical = value
[docs]
def wrap_text(self):
return self._wrap_text
[docs]
def set_wrap_text(self, value):
self._wrap_text = value
def _get_line_style(style):
if isinstance(style, str):
# Capitalize logic or dictionary?
# Enums are like "Thin", "Thick", "Dashed"
# Let's try to match case-insensitive
for name, member in XLLineStyle.__members__.items():
if name.lower() == style.lower():
return member
# Fallback to Thin if unknown or raise?
# Let's raise or default. Defaulting to Thin might be confusing.
# But raising might break simple assumptions.
# Given "thick" -> "Thick" works.
pass
return style
[docs]
class Side:
def __init__(self, style=XLLineStyle.Thin, color=None):
self._style = _get_line_style(style)
if color:
if isinstance(color, str):
self._color = XLColor(color)
else:
self._color = color
else:
self._color = XLColor(0, 0, 0)
[docs]
def style(self):
return self._style
[docs]
def color(self):
return self._color
[docs]
class Border:
def __init__(
self,
left=None,
right=None,
top=None,
bottom=None,
diagonal=None,
outline=None,
):
self._left = Side(getattr(XLLineStyle, "None"), XLColor(0, 0, 0))
self._right = Side(getattr(XLLineStyle, "None"), XLColor(0, 0, 0))
self._top = Side(getattr(XLLineStyle, "None"), XLColor(0, 0, 0))
self._bottom = Side(getattr(XLLineStyle, "None"), XLColor(0, 0, 0))
self._diagonal = Side(getattr(XLLineStyle, "None"), XLColor(0, 0, 0))
if outline:
left = right = top = bottom = outline
if left:
if isinstance(left, Side):
self._left = left
else:
self._left = Side(_get_line_style(left), XLColor(0, 0, 0))
if right:
if isinstance(right, Side):
self._right = right
else:
self._right = Side(_get_line_style(right), XLColor(0, 0, 0))
if top:
if isinstance(top, Side):
self._top = top
else:
self._top = Side(_get_line_style(top), XLColor(0, 0, 0))
if bottom:
if isinstance(bottom, Side):
self._bottom = bottom
else:
self._bottom = Side(_get_line_style(bottom), XLColor(0, 0, 0))
if diagonal:
if isinstance(diagonal, Side):
self._diagonal = diagonal
else:
self._diagonal = Side(_get_line_style(diagonal), XLColor(0, 0, 0))
[docs]
def left(self):
return self._left
[docs]
def right(self):
return self._right
[docs]
def top(self):
return self._top
[docs]
def bottom(self):
return self._bottom
[docs]
def diagonal(self):
return self._diagonal
[docs]
def set_left(self, style, color):
self._left = Side(style, color)
[docs]
def set_right(self, style, color):
self._right = Side(style, color)
[docs]
def set_top(self, style, color):
self._top = Side(style, color)
[docs]
def set_bottom(self, style, color):
self._bottom = Side(style, color)
[docs]
def set_diagonal(self, style, color):
self._diagonal = Side(style, color)
[docs]
class Protection:
def __init__(self, locked=True, hidden=False):
self.locked = locked
self.hidden = hidden
[docs]
class Style:
def __init__(
self,
font=None,
fill=None,
border=None,
alignment=None,
number_format=None,
protection=None,
):
self.font = font
self.fill = fill
self.border = border
self.alignment = alignment
self.number_format = number_format
self.protection = protection
self.style_index = 0 # To be set by workbook.add_style
def __int__(self):
return self.style_index