split_api_list.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # -*- coding: utf-8 -*-
  2. """把 API清单.xlsx 按 module 拆成四个 sheet(admin / store / api / timer)。
  3. - 保留原 9 列与行序;
  4. - 表头加粗、冻结首行、自动筛选、列宽与自动换行;
  5. - 原文件先备份到 backup/API清单-原始.xlsx。
  6. """
  7. import shutil
  8. from pathlib import Path
  9. import openpyxl
  10. from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
  11. from openpyxl.utils import get_column_letter
  12. ROOT = Path(__file__).resolve().parents[1]
  13. SRC = ROOT / "API清单.xlsx"
  14. BACKUP = ROOT / "backup" / "API清单-原始.xlsx"
  15. SHEETS = [("admin", "管理端"), ("store", "商家端"), ("api", "客户端"), ("timer", "定时任务")]
  16. WIDTHS = [10, 18, 18, 16, 24, 44, 18, 26, 8]
  17. HEAD_FILL = PatternFill("solid", fgColor="1F3864")
  18. HEAD_FONT = Font(name="微软雅黑", size=10, bold=True, color="FFFFFF")
  19. BODY_FONT = Font(name="微软雅黑", size=10)
  20. THIN = Side(style="thin", color="D9D9D9")
  21. BORDER = Border(left=THIN, right=THIN, top=THIN, bottom=THIN)
  22. def main():
  23. src_wb = openpyxl.load_workbook(SRC)
  24. src_ws = src_wb["API清单"]
  25. rows = list(src_ws.iter_rows(values_only=True))
  26. header, data = rows[0], [r for r in rows[1:] if any(v is not None for v in r)]
  27. BACKUP.parent.mkdir(parents=True, exist_ok=True)
  28. shutil.copy2(SRC, BACKUP)
  29. wb = openpyxl.Workbook()
  30. wb.remove(wb.active)
  31. for module, label in SHEETS:
  32. subset = [r for r in data if r[0] == module]
  33. ws = wb.create_sheet("%s-%s" % (module, label))
  34. ws.append(header)
  35. for r in subset:
  36. ws.append(list(r))
  37. for c in range(1, len(header) + 1):
  38. cell = ws.cell(row=1, column=c)
  39. cell.fill = HEAD_FILL
  40. cell.font = HEAD_FONT
  41. cell.alignment = Alignment(horizontal="center", vertical="center")
  42. cell.border = BORDER
  43. ws.column_dimensions[get_column_letter(c)].width = WIDTHS[c - 1]
  44. ws.row_dimensions[1].height = 24
  45. for row in ws.iter_rows(min_row=2, max_row=ws.max_row, max_col=len(header)):
  46. for cell in row:
  47. cell.font = BODY_FONT
  48. cell.border = BORDER
  49. col = cell.column
  50. if col in (7, 8):
  51. cell.alignment = Alignment(vertical="top", wrap_text=True)
  52. elif col == 9:
  53. cell.alignment = Alignment(horizontal="center", vertical="top")
  54. else:
  55. cell.alignment = Alignment(vertical="center")
  56. ws.freeze_panes = "A2"
  57. ws.auto_filter.ref = "A1:%s%d" % (get_column_letter(len(header)), max(ws.max_row, 1))
  58. print("%-14s %d 条" % (ws.title, len(subset)))
  59. wb.save(SRC)
  60. print("已保存:", SRC)
  61. print("原文件备份:", BACKUP)
  62. if __name__ == "__main__":
  63. main()