Add xlsxwriter-based Excel generation scripts with openpyxl implementation
- 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>
This commit is contained in:
143
venv/lib/python3.12/site-packages/xlsxwriter/relationships.py
Normal file
143
venv/lib/python3.12/site-packages/xlsxwriter/relationships.py
Normal file
@@ -0,0 +1,143 @@
|
||||
###############################################################################
|
||||
#
|
||||
# Relationships - A class for writing the Excel XLSX Worksheet file.
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-2-Clause
|
||||
#
|
||||
# Copyright (c) 2013-2025, John McNamara, jmcnamara@cpan.org
|
||||
#
|
||||
|
||||
# Package imports.
|
||||
from . import xmlwriter
|
||||
|
||||
# Long namespace strings used in the class.
|
||||
SCHEMA_ROOT = "http://schemas.openxmlformats.org"
|
||||
PACKAGE_SCHEMA = SCHEMA_ROOT + "/package/2006/relationships"
|
||||
DOCUMENT_SCHEMA = SCHEMA_ROOT + "/officeDocument/2006/relationships"
|
||||
|
||||
|
||||
class Relationships(xmlwriter.XMLwriter):
|
||||
"""
|
||||
A class for writing the Excel XLSX Relationships file.
|
||||
|
||||
|
||||
"""
|
||||
|
||||
###########################################################################
|
||||
#
|
||||
# Public API.
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
def __init__(self) -> None:
|
||||
"""
|
||||
Constructor.
|
||||
|
||||
"""
|
||||
|
||||
super().__init__()
|
||||
|
||||
self.relationships = []
|
||||
self.id = 1
|
||||
|
||||
###########################################################################
|
||||
#
|
||||
# Private API.
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
def _assemble_xml_file(self) -> None:
|
||||
# Assemble and write the XML file.
|
||||
|
||||
# Write the XML declaration.
|
||||
self._xml_declaration()
|
||||
|
||||
self._write_relationships()
|
||||
|
||||
# Close the file.
|
||||
self._xml_close()
|
||||
|
||||
def _add_document_relationship(self, rel_type, target, target_mode=None) -> None:
|
||||
# Add container relationship to XLSX .rels xml files.
|
||||
rel_type = DOCUMENT_SCHEMA + rel_type
|
||||
|
||||
self.relationships.append((rel_type, target, target_mode))
|
||||
|
||||
def _add_package_relationship(self, rel_type, target) -> None:
|
||||
# Add container relationship to XLSX .rels xml files.
|
||||
rel_type = PACKAGE_SCHEMA + rel_type
|
||||
|
||||
self.relationships.append((rel_type, target, None))
|
||||
|
||||
def _add_ms_package_relationship(self, rel_type, target) -> None:
|
||||
# Add container relationship to XLSX .rels xml files. Uses MS schema.
|
||||
schema = "http://schemas.microsoft.com/office/2006/relationships"
|
||||
rel_type = schema + rel_type
|
||||
|
||||
self.relationships.append((rel_type, target, None))
|
||||
|
||||
def _add_rich_value_relationship(self) -> None:
|
||||
# Add RichValue relationship to XLSX .rels xml files.
|
||||
schema = "http://schemas.microsoft.com/office/2022/10/relationships/"
|
||||
rel_type = schema + "richValueRel"
|
||||
target = "richData/richValueRel.xml"
|
||||
self.relationships.append((rel_type, target, None))
|
||||
|
||||
schema = "http://schemas.microsoft.com/office/2017/06/relationships/"
|
||||
rel_type = schema + "rdRichValue"
|
||||
target = "richData/rdrichvalue.xml"
|
||||
self.relationships.append((rel_type, target, None))
|
||||
|
||||
rel_type = schema + "rdRichValueStructure"
|
||||
target = "richData/rdrichvaluestructure.xml"
|
||||
self.relationships.append((rel_type, target, None))
|
||||
|
||||
rel_type = schema + "rdRichValueTypes"
|
||||
target = "richData/rdRichValueTypes.xml"
|
||||
self.relationships.append((rel_type, target, None))
|
||||
|
||||
def _add_feature_bag_relationship(self) -> None:
|
||||
# Add FeaturePropertyBag relationship to XLSX .rels xml files.
|
||||
schema = "http://schemas.microsoft.com/office/2022/11/relationships/"
|
||||
rel_type = schema + "FeaturePropertyBag"
|
||||
target = "featurePropertyBag/featurePropertyBag.xml"
|
||||
self.relationships.append((rel_type, target, None))
|
||||
|
||||
###########################################################################
|
||||
#
|
||||
# XML methods.
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
def _write_relationships(self) -> None:
|
||||
# Write the <Relationships> element.
|
||||
attributes = [
|
||||
(
|
||||
"xmlns",
|
||||
PACKAGE_SCHEMA,
|
||||
)
|
||||
]
|
||||
|
||||
self._xml_start_tag("Relationships", attributes)
|
||||
|
||||
for relationship in self.relationships:
|
||||
self._write_relationship(relationship)
|
||||
|
||||
self._xml_end_tag("Relationships")
|
||||
|
||||
def _write_relationship(self, relationship) -> None:
|
||||
# Write the <Relationship> element.
|
||||
rel_type, target, target_mode = relationship
|
||||
|
||||
attributes = [
|
||||
("Id", "rId" + str(self.id)),
|
||||
("Type", rel_type),
|
||||
("Target", target),
|
||||
]
|
||||
|
||||
self.id += 1
|
||||
|
||||
if target_mode:
|
||||
attributes.append(("TargetMode", target_mode))
|
||||
|
||||
self._xml_empty_tag("Relationship", attributes)
|
||||
Reference in New Issue
Block a user