|
|
@@ -0,0 +1,79 @@
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+"""把 API清单.xlsx 按 module 拆成四个 sheet(admin / store / api / timer)。
|
|
|
+
|
|
|
+- 保留原 9 列与行序;
|
|
|
+- 表头加粗、冻结首行、自动筛选、列宽与自动换行;
|
|
|
+- 原文件先备份到 backup/API清单-原始.xlsx。
|
|
|
+"""
|
|
|
+import shutil
|
|
|
+from pathlib import Path
|
|
|
+
|
|
|
+import openpyxl
|
|
|
+from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
|
|
|
+from openpyxl.utils import get_column_letter
|
|
|
+
|
|
|
+ROOT = Path(__file__).resolve().parents[1]
|
|
|
+SRC = ROOT / "API清单.xlsx"
|
|
|
+BACKUP = ROOT / "backup" / "API清单-原始.xlsx"
|
|
|
+
|
|
|
+SHEETS = [("admin", "管理端"), ("store", "商家端"), ("api", "客户端"), ("timer", "定时任务")]
|
|
|
+WIDTHS = [10, 18, 18, 16, 24, 44, 18, 26, 8]
|
|
|
+
|
|
|
+HEAD_FILL = PatternFill("solid", fgColor="1F3864")
|
|
|
+HEAD_FONT = Font(name="微软雅黑", size=10, bold=True, color="FFFFFF")
|
|
|
+BODY_FONT = Font(name="微软雅黑", size=10)
|
|
|
+THIN = Side(style="thin", color="D9D9D9")
|
|
|
+BORDER = Border(left=THIN, right=THIN, top=THIN, bottom=THIN)
|
|
|
+
|
|
|
+
|
|
|
+def main():
|
|
|
+ src_wb = openpyxl.load_workbook(SRC)
|
|
|
+ src_ws = src_wb["API清单"]
|
|
|
+ rows = list(src_ws.iter_rows(values_only=True))
|
|
|
+ header, data = rows[0], [r for r in rows[1:] if any(v is not None for v in r)]
|
|
|
+
|
|
|
+ BACKUP.parent.mkdir(parents=True, exist_ok=True)
|
|
|
+ shutil.copy2(SRC, BACKUP)
|
|
|
+
|
|
|
+ wb = openpyxl.Workbook()
|
|
|
+ wb.remove(wb.active)
|
|
|
+
|
|
|
+ for module, label in SHEETS:
|
|
|
+ subset = [r for r in data if r[0] == module]
|
|
|
+ ws = wb.create_sheet("%s-%s" % (module, label))
|
|
|
+ ws.append(header)
|
|
|
+ for r in subset:
|
|
|
+ ws.append(list(r))
|
|
|
+
|
|
|
+ for c in range(1, len(header) + 1):
|
|
|
+ cell = ws.cell(row=1, column=c)
|
|
|
+ cell.fill = HEAD_FILL
|
|
|
+ cell.font = HEAD_FONT
|
|
|
+ cell.alignment = Alignment(horizontal="center", vertical="center")
|
|
|
+ cell.border = BORDER
|
|
|
+ ws.column_dimensions[get_column_letter(c)].width = WIDTHS[c - 1]
|
|
|
+ ws.row_dimensions[1].height = 24
|
|
|
+
|
|
|
+ for row in ws.iter_rows(min_row=2, max_row=ws.max_row, max_col=len(header)):
|
|
|
+ for cell in row:
|
|
|
+ cell.font = BODY_FONT
|
|
|
+ cell.border = BORDER
|
|
|
+ col = cell.column
|
|
|
+ if col in (7, 8):
|
|
|
+ cell.alignment = Alignment(vertical="top", wrap_text=True)
|
|
|
+ elif col == 9:
|
|
|
+ cell.alignment = Alignment(horizontal="center", vertical="top")
|
|
|
+ else:
|
|
|
+ cell.alignment = Alignment(vertical="center")
|
|
|
+
|
|
|
+ ws.freeze_panes = "A2"
|
|
|
+ ws.auto_filter.ref = "A1:%s%d" % (get_column_letter(len(header)), max(ws.max_row, 1))
|
|
|
+ print("%-14s %d 条" % (ws.title, len(subset)))
|
|
|
+
|
|
|
+ wb.save(SRC)
|
|
|
+ print("已保存:", SRC)
|
|
|
+ print("原文件备份:", BACKUP)
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ main()
|