Merge pull request 'export-form-4: добавил лист структура в экспорт, поправил экспорт с метаданными по editable columns' (#71) from export-form-4 into test
Reviewed-on: #71
This commit is contained in:
commit
e721beb6dd
@ -115,6 +115,12 @@ class ExportService:
|
||||
row_normalizer=self.form1_row_normalizer.normalize,
|
||||
value_serializer=self.value_serializer.to_excel_value,
|
||||
),
|
||||
"STRUCTURE": DepthSheetWriter(
|
||||
columns_dict=FORM1_DEPTH_COLUMNS,
|
||||
row_normalizer=self.form1_row_normalizer.normalize,
|
||||
value_serializer=self.value_serializer.to_excel_value,
|
||||
colors_config=FORM1_COLORS["AHR"],
|
||||
),
|
||||
}
|
||||
self.form3_report_writer = TabularSheetWriter(
|
||||
columns=FORM3_REPORT_COLUMNS,
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import abc
|
||||
from collections import defaultdict
|
||||
from typing import Any, Callable
|
||||
|
||||
@ -15,7 +16,28 @@ RowNormalizer = Callable[[dict[str, Any]], dict[str, Any]]
|
||||
ValueSerializer = Callable[[Any], Any]
|
||||
|
||||
|
||||
class TabularSheetWriter:
|
||||
class AbstractWriter(abc.ABC):
|
||||
|
||||
def _set_widths(self, worksheet: Worksheet):
|
||||
for col in worksheet.columns:
|
||||
max_len = 0
|
||||
col_letter = get_column_letter(col[0].column) # Get alphabetical column name (e.g., 'A')
|
||||
|
||||
for cell in col:
|
||||
if cell.value is not None:
|
||||
cell_len = len(str(cell.value))
|
||||
if cell_len > max_len:
|
||||
max_len = cell_len
|
||||
|
||||
adjusted_width = max(max_len + 3, 10)
|
||||
worksheet.column_dimensions[col_letter].width = adjusted_width
|
||||
|
||||
@abc.abstractmethod
|
||||
def write(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
|
||||
class TabularSheetWriter(AbstractWriter):
|
||||
def __init__(
|
||||
self,
|
||||
columns: list[tuple[str, str]],
|
||||
@ -34,9 +56,10 @@ class TabularSheetWriter:
|
||||
worksheet.append(
|
||||
[self.value_serializer(normalized.get(key)) for key, _ in self.columns]
|
||||
)
|
||||
self._set_widths(worksheet)
|
||||
|
||||
|
||||
class DepthSheetWriter:
|
||||
class DepthSheetWriter(AbstractWriter):
|
||||
alignment = Alignment(horizontal='center', vertical='center')
|
||||
thin_border = Border(
|
||||
left=Side(style='thin'),
|
||||
@ -166,20 +189,6 @@ class DepthSheetWriter:
|
||||
cell.font = Font(color=color["color"])
|
||||
return current_column
|
||||
|
||||
def _set_widths(self, worksheet: Worksheet):
|
||||
for col in worksheet.columns:
|
||||
max_len = 0
|
||||
col_letter = get_column_letter(col[0].column) # Get alphabetical column name (e.g., 'A')
|
||||
|
||||
for cell in col:
|
||||
if cell.value is not None:
|
||||
cell_len = len(str(cell.value))
|
||||
if cell_len > max_len:
|
||||
max_len = cell_len
|
||||
|
||||
adjusted_width = max(max_len + 3, 10)
|
||||
worksheet.column_dimensions[col_letter].width = adjusted_width
|
||||
|
||||
def _set_color_to_row(self, ws: Worksheet, item_type: str) -> None:
|
||||
if not self.palette or item_type in ("SUB_ITEM", "INPUT"):
|
||||
return
|
||||
@ -199,7 +208,12 @@ class DepthSheetWriter:
|
||||
def write(self, worksheet: Worksheet, rows: list[tuple]) -> None:
|
||||
self._write_header(worksheet)
|
||||
for row in rows:
|
||||
raw_data = row[3] if len(row) > 3 and isinstance(row[3], dict) else {}
|
||||
if len(row) > 3 and isinstance(row[3], dict):
|
||||
if row[0] == 'META':
|
||||
continue
|
||||
raw_data = row[3]
|
||||
else:
|
||||
raw_data = {}
|
||||
normalized = self.row_normalizer(raw_data)
|
||||
worksheet.append(
|
||||
[self.value_serializer(normalized.get(key)) for key in self.columns]
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user