- Created create_excel_xlsxwriter.py and update_excel_xlsxwriter.py - Uses openpyxl exclusively to preserve Excel formatting and formulas - Updated server.js to use new xlsxwriter scripts for form submissions - Maintains all original functionality while ensuring proper Excel file handling 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
111 lines
3.3 KiB
Python
111 lines
3.3 KiB
Python
###############################################################################
|
|
#
|
|
# ChartTitle - A class for representing Excel chart titles.
|
|
#
|
|
# SPDX-License-Identifier: BSD-2-Clause
|
|
#
|
|
# Copyright (c) 2013-2025, John McNamara, jmcnamara@cpan.org
|
|
#
|
|
|
|
from typing import Any, Dict, Optional
|
|
|
|
|
|
class ChartTitle:
|
|
"""
|
|
A class to represent an Excel chart title.
|
|
|
|
This class encapsulates all title related properties and methods for the
|
|
chart title and axis titles.
|
|
"""
|
|
|
|
def __init__(self) -> None:
|
|
"""
|
|
Initialize a ChartTitle instance.
|
|
"""
|
|
self.font: Optional[Dict[str, Any]] = None
|
|
self.name: Optional[str] = None
|
|
self.formula: Optional[str] = None
|
|
self.data_id: Optional[int] = None
|
|
self.layout: Optional[Dict[str, Any]] = None
|
|
self.overlay: Optional[bool] = None
|
|
self.hidden: bool = False
|
|
self.line: Optional[Dict[str, Any]] = None
|
|
self.fill: Optional[Dict[str, Any]] = None
|
|
self.pattern: Optional[Dict[str, Any]] = None
|
|
self.gradient: Optional[Dict[str, Any]] = None
|
|
|
|
def has_name(self) -> bool:
|
|
"""
|
|
Check if the title has a text name set.
|
|
|
|
Returns:
|
|
True if name has been set.
|
|
"""
|
|
return self.name is not None and self.name != ""
|
|
|
|
def has_formula(self) -> bool:
|
|
"""
|
|
Check if the title has a formula set.
|
|
|
|
Returns:
|
|
True if formula has been set.
|
|
"""
|
|
return self.formula is not None
|
|
|
|
def has_formatting(self) -> bool:
|
|
"""
|
|
Check if the title has any formatting properties set.
|
|
|
|
Returns:
|
|
True if the title has line, fill, pattern, or gradient formatting.
|
|
"""
|
|
has_line = self.line is not None and self.line.get("defined", False)
|
|
has_fill = self.fill is not None and self.fill.get("defined", False)
|
|
has_pattern = self.pattern
|
|
has_gradient = self.gradient
|
|
|
|
return has_line or has_fill or has_pattern or has_gradient
|
|
|
|
def get_formatting(self) -> Dict[str, Any]:
|
|
"""
|
|
Get a dictionary containing the formatting properties.
|
|
|
|
Returns:
|
|
A dictionary with line, fill, pattern, and gradient properties.
|
|
"""
|
|
return {
|
|
"line": self.line,
|
|
"fill": self.fill,
|
|
"pattern": self.pattern,
|
|
"gradient": self.gradient,
|
|
}
|
|
|
|
def is_hidden(self) -> bool:
|
|
"""
|
|
Check if the title is explicitly hidden.
|
|
|
|
Returns:
|
|
True if title is hidden.
|
|
"""
|
|
return self.hidden
|
|
|
|
def __repr__(self) -> str:
|
|
"""
|
|
Return a string representation of the ChartTitle.
|
|
"""
|
|
return (
|
|
f"ChartTitle(\n"
|
|
f" name = {self.name!r},\n"
|
|
f" formula = {self.formula!r},\n"
|
|
f" hidden = {self.hidden!r},\n"
|
|
f" font = {self.font!r},\n"
|
|
f" line = {self.line!r},\n"
|
|
f" fill = {self.fill!r},\n"
|
|
f" pattern = {self.pattern!r},\n"
|
|
f" gradient = {self.gradient!r},\n"
|
|
f" layout = {self.layout!r},\n"
|
|
f" overlay = {self.overlay!r},\n"
|
|
f" has_formatting = {self.has_formatting()!r},\n"
|
|
f")\n"
|
|
)
|