提交
This commit is contained in:
1 parent
c3bd2c00ae
commit
a52fe77e34
39 files changed
+609647
-9238
No files matched your search
@@ -0,0 +1,61 @@
|
||||
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)
|
||||
Reference in new issue
Block a user