From 4ef559b2a0e08e4b3235d7a82c64d1d582b03497 Mon Sep 17 00:00:00 2001 From: Daniel Hornung <d.hornung@indiscale.com> Date: Tue, 19 Mar 2024 13:14:20 +0100 Subject: [PATCH] WIP for fill_xlsx: More graceful handling of incomplete data. --- .../table_json_conversion/fill_xlsx.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/caosadvancedtools/table_json_conversion/fill_xlsx.py b/src/caosadvancedtools/table_json_conversion/fill_xlsx.py index c3859ac1..511c006d 100644 --- a/src/caosadvancedtools/table_json_conversion/fill_xlsx.py +++ b/src/caosadvancedtools/table_json_conversion/fill_xlsx.py @@ -27,6 +27,7 @@ import pathlib from collections import OrderedDict from types import SimpleNamespace from typing import Any, Dict, List, Optional, TextIO, Union +from warnings import warn from jsonschema import FormatChecker, validate from jsonschema.exceptions import ValidationError @@ -134,8 +135,9 @@ def _read_or_dict(data: Union[dict, str, TextIO]) -> dict: class TemplateFiller: """Class to fill XLSX templates. Has an index for all relevant columns.""" - def __init__(self, workbook: Workbook): + def __init__(self, workbook: Workbook, graceful: bool = False): self._workbook = workbook + self._graceful = graceful self._create_index() @property @@ -305,6 +307,7 @@ out: union[dict, None] # collecting the data assert isinstance(content, list) + content = [str(x) for x in content] value = ";".join(content) # TODO we need escaping of values path_str = p2s(path) assert path_str not in insertables @@ -318,6 +321,9 @@ out: union[dict, None] insert_row = None sheet = None for path_str, value in insertables.items(): + if self._graceful and path_str not in self._sheet_index: + warn(f"Ignoring path with missing sheet index: {path_str}") + continue sheet_meta = self._sheet_index[path_str] if sheet is None: sheet = sheet_meta.sheet @@ -359,7 +365,8 @@ result: str Path for the result XLSX. validation_schema: dict, optional If given, validate the date against this schema first. This raises an exception if the validation - fails. + fails. If no validation schema is given, try to ignore more errors in the data when filling the + XLSX template. """ data = _read_or_dict(data) assert isinstance(data, dict) @@ -377,7 +384,7 @@ validation_schema: dict, optional # Filling the data result_wb = load_workbook(template) - template_filler = TemplateFiller(result_wb) + template_filler = TemplateFiller(result_wb, graceful=(validation_schema is None)) template_filler.fill_data(data=data) parentpath = pathlib.Path(result).parent -- GitLab