| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- from __future__ import annotations
- from typing import Sequence
- from openpyxl.utils import get_column_letter
- from openpyxl.workbook.workbook import Workbook
- from openpyxl.worksheet.datavalidation import DataValidation
- from openpyxl.worksheet.worksheet import Worksheet
- def write_option_sheet(
- wb: Workbook,
- sheet_title: str,
- labels: Sequence[str],
- ids: Sequence[str] | None = None,
- *,
- hidden: bool = True,
- ) -> str:
- """写入选项表:A=label,可选 B=id。返回 sheet_title。"""
- if sheet_title in wb.sheetnames:
- ws = wb[sheet_title]
- wb.remove(ws)
- ws = wb.create_sheet(sheet_title)
- ws.append(["label", "id"] if ids is not None else ["label"])
- for i, lab in enumerate(labels):
- if ids is not None:
- ws.append([lab, ids[i] if i < len(ids) else ""])
- else:
- ws.append([lab])
- if hidden:
- ws.sheet_state = "hidden"
- return sheet_title
- def add_list_validation(
- ws: Worksheet,
- *,
- option_sheet: str,
- option_rows: int,
- target_col: int,
- start_row: int,
- end_row: int,
- allow_blank: bool = True,
- ) -> None:
- """option_rows 为选项数据行数(不含表头)。option 在 A2:A{1+option_rows}。"""
- if option_rows <= 0:
- return
- last = 1 + option_rows
- formula = f"='{option_sheet}'!$A$2:$A${last}"
- col = get_column_letter(target_col)
- dv = DataValidation(
- type="list",
- formula1=formula,
- allow_blank=allow_blank,
- showErrorMessage=True,
- showInputMessage=True,
- )
- dv.error = "请从下拉列表选择"
- dv.errorTitle = "无效值"
- dv.add(f"{col}{start_row}:{col}{end_row}")
- ws.add_data_validation(dv)
|