export_teams_excel.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. # -*- coding: utf-8 -*-
  2. # Author : Charley
  3. # Python : 3.12.10
  4. # Date : 2026/08/04
  5. """从 球队.json 解析 teams 数据(中文名/英文名/价格/数量)并导出到 Excel。
  6. 球队.json 实为 .py 风格文本:真正的 JSON 存放在 `json = \"\"\"...\"\"\"` 三引号块里,
  7. teams 位于 data.remainingRandomTeamSnapshot.teams。字段对应:
  8. 中文名 teamNameZh / 英文名 teamNameEn / 价格 unitPrice / 数量 availableStock
  9. """
  10. import re
  11. import json
  12. import sys
  13. from openpyxl import Workbook
  14. from openpyxl.styles import Font, Alignment
  15. SRC_FILE = "球队.json" # 源文件(含三引号 JSON 块)
  16. OUT_FILE = "球队.xlsx" # 导出的 Excel
  17. HEADERS = ["中文名", "英文名", "价格", "数量"] # 列顺序
  18. def extract_teams(src: str) -> list[dict]:
  19. """从源文件中抽取三引号 JSON 并取出 teams 列表。
  20. Args:
  21. src (str): 源文件路径。
  22. Returns:
  23. list[dict]: teams 原始字典列表;未找到返回空列表。
  24. Raises:
  25. ValueError: 源文件里找不到三引号包裹的 JSON 块时抛出。
  26. """
  27. txt = open(src, encoding="utf-8").read()
  28. m = re.search(r'"""(.*?)"""', txt, re.S) # 抓取三引号内的 JSON 文本
  29. if not m:
  30. raise ValueError(f"{src} 中未找到三引号包裹的 JSON 块")
  31. data = json.loads(m.group(1).strip())
  32. # teams 固定在 data.remainingRandomTeamSnapshot.teams
  33. snapshot = (data.get("data") or {}).get("remainingRandomTeamSnapshot") or {}
  34. return snapshot.get("teams") or []
  35. def export_excel(teams: list[dict], out: str):
  36. """把 teams 的四个字段写入 Excel(带表头、加粗、列宽自适应)。
  37. Args:
  38. teams (list[dict]): extract_teams 返回的球队字典列表。
  39. out (str): 导出的 xlsx 文件路径。
  40. """
  41. wb = Workbook()
  42. ws = wb.active
  43. ws.title = "球队"
  44. # 表头:加粗 + 居中
  45. ws.append(HEADERS)
  46. for cell in ws[1]:
  47. cell.font = Font(bold=True)
  48. cell.alignment = Alignment(horizontal="center")
  49. # 数据行:价格转 float 便于 Excel 计算,数量转 int
  50. for t in teams:
  51. ws.append([
  52. t.get("teamNameZh"),
  53. t.get("teamNameEn"),
  54. float(t["unitPrice"]) if t.get("unitPrice") is not None else None,
  55. t.get("availableStock"),
  56. ])
  57. # 简单列宽自适应(按各列最长字符估算,中文按 2 宽计)
  58. for col_idx, header in enumerate(HEADERS, 1):
  59. max_len = max(
  60. [len(str(header).encode("gbk", "ignore"))] +
  61. [len(str(ws.cell(row=r, column=col_idx).value or "").encode("gbk", "ignore"))
  62. for r in range(2, ws.max_row + 1)]
  63. )
  64. ws.column_dimensions[chr(64 + col_idx)].width = max_len + 2
  65. wb.save(out)
  66. def main():
  67. """解析 球队.json 并导出 球队.xlsx,打印导出条数。"""
  68. teams = extract_teams(SRC_FILE)
  69. if not teams:
  70. print("未解析到 teams 数据,退出")
  71. sys.exit(1)
  72. export_excel(teams, OUT_FILE)
  73. print(f"已导出 {len(teams)} 条球队数据 -> {OUT_FILE}")
  74. if __name__ == "__main__":
  75. main()