def load_lds_status_report_worksheet(file_path: Path) -> Optional[Worksheet]:
"""Открывает первый лист xlsx-отчёта о режиме СОУ. При ошибке возвращает None."""
if not file_path.exists():
return None
try:
workbook = load_workbook(filename=str(file_path), read_only=True, data_only=True)
except Exception:
return None
sheet_names = workbook.sheetnames
if not sheet_names:
return None
return workbook[sheet_names[ReportConst.DEFAULT_SHEET_INDEX]]
def get_lds_status_report_column_headers(worksheet: Worksheet) -> List[str]:
"""Возвращает непустые заголовки колонок из строки REPORT_COLUMN_HEADERS_ROW."""
headers: List[str] = []
column_index = 1
while True:
cell_value = worksheet.cell(row=LdsReportConst.REPORT_COLUMN_HEADERS_ROW, column=column_index).value
if cell_value is None or not str(cell_value).strip():
break
headers.append(_stringify_cell(cell_value).strip())
column_index += 1
return headers
def parse_lds_status_report_title(title_raw: object) -> ReportTitleInfo:
"""
Парсит первую строку шапки отчёта о режиме СОУ.
Извлекает period_start/period_end по REPORT_HEADER_PERIOD_PATTERN.
"""
title_str = _stringify_cell(title_raw)
match = re.search(LdsReportConst.REPORT_HEADER_PERIOD_PATTERN, title_str)
if match is None:
return ReportTitleInfo(raw_title=title_str)
return ReportTitleInfo(
raw_title=title_str,
period_start=parse_report_datetime(match.group("period_start")),
period_end=parse_report_datetime(match.group("period_end")),
)
def build_lds_status_report_file_name(
tu_description: str,
period_start: datetime,
period_end: datetime,
) -> str:
"""
Ожидаемое имя xlsx при скачивании:
«Отчет о режиме работы СОУ. Тихорецк-Новороссийск-3 DD.MM.YYYY HH_MM_SS - DD.MM.YYYY HH_MM_SS.xlsx».
"""
start_text = normalize_report_period_naive(period_start).strftime(ReportConst.REPORT_FILE_NAME_DATETIME_FORMAT)
end_text = normalize_report_period_naive(period_end).strftime(ReportConst.REPORT_FILE_NAME_DATETIME_FORMAT)
return (
f"{LdsReportConst.LDS_STATUS_REPORT_NAME_PART}. {tu_description} {start_text} - {end_text}"
f"{ReportConst.XLSX_EXTENSION}"
)