当前位置: 首页 > news >正文

swagger转word--python版本

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
将 Swagger JSON 文件转换为 Word 格式的接口文档
"""import json
from docx import Document
from docx.shared import Pt, RGBColor, Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENTdef add_heading(doc, text, level=1):"""添加标题"""heading = doc.add_heading(text, level=level)heading.alignment = WD_PARAGRAPH_ALIGNMENT.LEFTreturn headingdef add_paragraph(doc, text, bold=False, size=11):"""添加段落"""para = doc.add_paragraph()run = para.add_run(text)run.font.size = Pt(size)run.font.name = '微软雅黑'if bold:run.bold = Truereturn paradef add_table_with_data(doc, headers, data):"""添加表格"""table = doc.add_table(rows=1, cols=len(headers))table.style = 'Light Grid Accent 1'# 添加表头header_cells = table.rows[0].cellsfor i, header in enumerate(headers):header_cells[i].text = headerfor paragraph in header_cells[i].paragraphs:for run in paragraph.runs:run.font.bold = Truerun.font.size = Pt(10)run.font.name = '微软雅黑'# 添加数据行for row_data in data:row = table.add_row()for i, cell_data in enumerate(row_data):row.cells[i].text = str(cell_data)for paragraph in row.cells[i].paragraphs:for run in paragraph.runs:run.font.size = Pt(9)run.font.name = '微软雅黑'return tabledef format_schema_type(schema):"""格式化 schema 类型"""if not schema:return "any"schema_type = schema.get('type', 'object')if schema_type == 'array':items = schema.get('items', {})item_type = format_schema_type(items)return f"array<{item_type}>"elif schema_type == 'object':properties = schema.get('properties', {})if properties:props_str = ', '.join([f"{k}: {format_schema_type(v)}" for k, v in properties.items()])return f"{{{props_str}}}"return "object"return schema_typedef parse_swagger_to_word(swagger_file, output_file):"""解析 Swagger JSON 并生成 Word 文档"""# 读取 Swagger JSON 文件with open(swagger_file, 'r', encoding='utf-8') as f:swagger_data = json.load(f)# 创建 Word 文档doc = Document()# 设置文档标题title = doc.add_heading(swagger_data['info']['title'], level=0)title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER# 添加基本信息add_heading(doc, '文档信息', level=1)info = swagger_data.get('info', {})add_paragraph(doc, f"版本: {info.get('version', 'N/A')}")if info.get('description'):add_paragraph(doc, f"描述: {info.get('description')}")# 添加服务器信息servers = swagger_data.get('servers', [])if servers:add_heading(doc, '服务器地址', level=1)for server in servers:add_paragraph(doc, f"• {server.get('description', 'N/A')}: {server.get('url', 'N/A')}")# 添加认证信息security_schemes = swagger_data.get('components', {}).get('securitySchemes', {})if security_schemes:add_heading(doc, '认证方式', level=1)for name, scheme in security_schemes.items():add_paragraph(doc, f"• {name}: {scheme.get('type', 'N/A')} - {scheme.get('scheme', 'N/A')}")# 添加 API 接口文档add_heading(doc, 'API 接口列表', level=1)paths = swagger_data.get('paths', {})api_count = 0for path, methods in paths.items():for method, details in methods.items():api_count += 1# 接口标题summary = details.get('summary', '无描述')add_heading(doc, f"{api_count}. {summary}", level=2)# 基本信息表basic_info = [['接口路径', path],['请求方法', method.upper()],['标签', ', '.join(details.get('tags', []))],]add_table_with_data(doc, ['属性', '值'], basic_info)doc.add_paragraph()# 描述description = details.get('description')if description and description.strip():add_paragraph(doc, f"描述: {description.strip()}", size=10)doc.add_paragraph()# 请求参数parameters = details.get('parameters', [])if parameters:add_heading(doc, '请求参数', level=3)param_data = []for param in parameters:param_name = param.get('name', 'N/A')param_in = param.get('in', 'N/A')param_required = '是' if param.get('required', False) else '否'param_type = param.get('schema', {}).get('type', 'string')param_desc = param.get('description', param.get('schema', {}).get('description', ''))param_default = param.get('schema', {}).get('default', '')param_data.append([param_name,param_in,param_required,param_type,param_desc,str(param_default) if param_default else '-'])add_table_with_data(doc,['参数名', '位置', '必填', '类型', '说明', '默认值'],param_data)doc.add_paragraph()# 请求体request_body = details.get('requestBody')if request_body:add_heading(doc, '请求体', level=3)content = request_body.get('content', {})for content_type, content_details in content.items():add_paragraph(doc, f"Content-Type: {content_type}", size=10)schema = content_details.get('schema', {})properties = schema.get('properties', {})required_fields = schema.get('required', [])if properties:body_data = []for prop_name, prop_details in properties.items():prop_type = prop_details.get('type', 'string')prop_desc = prop_details.get('description', '')prop_required = '是' if prop_name in required_fields else '否'prop_default = prop_details.get('default', '')prop_example = prop_details.get('example', '')body_data.append([prop_name,prop_required,prop_type,prop_desc,str(prop_default) if prop_default else '-',str(prop_example) if prop_example else '-'])add_table_with_data(doc,['字段名', '必填', '类型', '说明', '默认值', '示例'],body_data)doc.add_paragraph()# 响应responses = details.get('responses', {})if responses:add_heading(doc, '响应', level=3)response_data = []for status_code, response_detail in responses.items():response_desc = response_detail.get('description', 'N/A')response_data.append([status_code, response_desc])add_table_with_data(doc,['状态码', '说明'],response_data)doc.add_paragraph()# 添加分隔线doc.add_paragraph('_' * 80)doc.add_paragraph()# 保存文档doc.save(output_file)print(f"✓ 接口文档已生成: {output_file}")print(f"✓ 共解析 {api_count} 个接口")if __name__ == '__main__':swagger_json_file = '/Users/baai/Desktop/workspace/hei-large-screen/static/swagger.json'output_word_file = '/Users/baai/Desktop/workspace/hei-large-screen/API接口文档.docx'parse_swagger_to_word(swagger_json_file, output_word_file)

  

安装依赖:

pip install python-docx

  

http://www.jsqmd.com/news/582115/

相关文章:

  • 5分钟完全指南:用开源tcc-g15掌控Dell G15散热,告别官方AWCC卡顿
  • d2s-editor:革新性暗黑2存档管理的一站式工具
  • 遇到一个口头机遇的答辩准备2(ai告诉的要点)
  • 2026最新西南考银行培训推荐!贵州/贵阳优质银行招考培训权威榜单 - 十大品牌榜
  • 突破Windows远程桌面限制:RDP Wrapper Library全方位应用指南
  • P1884 [USACO12FEB] Overplanting S
  • 如何避免机械拼凑式的基金申请书撰写
  • idea比对两个文件差异
  • 随笔其二
  • 基于蓝牙及GSM的智能防盗系统设计与实现
  • 2026全自动三坐标测量机品牌实力榜单:谁更值得选? - 品牌推荐大师
  • 华硕笔记本终极性能控制指南:用GHelper取代臃肿的Armoury Crate
  • 3步掌握创意工坊壁纸高效获取工具
  • 2026届毕业生推荐的十大AI写作助手推荐榜单
  • 3个核心价值:Tiktokenizer如何解决AI开发中的令牌管理难题
  • 佰力博压电 d33-F(动态力)测试:精准表征压电材料动态性能
  • 2026最新西南银行备考/银行招聘培训推荐!贵阳地区优质机构权威榜单 - 十大品牌榜
  • AgentCPM-Report轻量化部署方案:Pixel Epic镜像免环境配置快速上手指南
  • 2026最新舞蹈艺考培训学校推荐!云南昆明优质机构权威榜单发布 - 十大品牌榜
  • 面向对象进阶 继承
  • Windows系统下Docker Desktop环境的完整迁移方案,包含镜像、容器和数据卷的备份恢复方法 将笔记本上Docker Desktop 东西迁移本地PC 电脑Docker Desktop上
  • 第三方系统集成若依权限校验
  • 【Python实战】搭建AI数字人对话系统:从语音识别到虚拟形象的全流程实现
  • 【数据要素+数据资产合集】100余份数据要素+数据资产方案资料合集(PPT+WORD)
  • MJh代码混淆实战指南:使用Obfuscar构建坚不可摧的安全防线
  • 基于Matlab的轴承-空心转轴-飞轮不同耦合类型动力学分析
  • N_m3u8DL-RE:跨平台流媒体解决方案的全方位技术指南
  • JPEGView:Windows平台终极快速图像查看器完全指南
  • 谭待在养虾之城说了两件事,Seedance 2.0公测与ArkClaw场景化落地
  • 喧嚣过后,重塑「数字光环」:后 315 时代的 GEO 合规新纪元