前言

本来在Swagger的基础上,前后端开发人员在开发生产期间,可以借此进行更加便捷的沟通交流。可是总有些时候,遇到一些难缠的,又不讲道理,偏偏觉得将Swagger文档地址丢给客户会不够正式!死活要一份word文档。

可是这个时候,如果接口数量上百个,甚至更多,一个一个手动输入word,那将是一笔耗时的工作。但却有什么办法可以解决呢?

对了,利用Swagge生成的Json文件转换为word文档不就可以了吗?

思路

1. 获取Swagger接口文档的Json文件

2. 解析Json文件数据填充到Html的表格中

3.根据生成的html转work文档

开始

一、根据Swagger版本获取Json数据

1.通过Swagger源码文件可以看到

可以拿到swagger生成的文档数据,所以我们可以新建一个控制器SwaggerController.cs,

        private readonly SwaggerGenerator _swaggerGenerator;        public SwaggerController(SwaggerGenerator swaggerGenerator)        {            _swaggerGenerator = swaggerGenerator;        }        ///         /// 导出文件        ///         /// 文件类型        /// 版本号V1        ///         [HttpGet]        public FileResult ExportWord(string type,string version)        {            string contenttype = string.Empty;            var model = _swaggerGenerator.GetSwagger(version); //1. 根据指定版本获取指定版本的json对象。        }

2. 在Startup.cs文件中,利用net core的ioc容器,注入SwaggerGenerator实例化,这样在后面的调用中可以直接使用这个方法

            services.AddScoped(); //注入SwaggerGenerator,后面可以直接使用这个方法

二、文件数据填充到Html的表格中

根据上面获取的model文件数据,这个时候,我们利用Razor文件,结合html的table模板,将数据遍历填充到页面中,生成完整的页面

Html模板

@using Swashbuckle.AspNetCore.Swagger;    Swagger API文档代码文件
Word接口文档

@Model.Info.Title

接口文档 @Model.Info.Version

联系方式

作者:@Model.Info.Contact.Name
Send email to Xunit.Core
@Model.Info.Contact.Name - Website

接口描述

@Model.Info.Description 说明 类型 @foreach (var item in Model.Paths) { if (item.Value.Operations != null) { foreach (var operation in item.Value.Operations) {

@operation.Value.Summary

URL @item.Key 请求方式 @operation.Key @if (operation.Value.Parameters != null && operation.Value.Parameters.Count > 0) { 参数名 参数类型 是否必填 说明 @foreach (var param in operation.Value.Parameters) { @param.Name @param.In @param.Required @param.Description } } 状态码 说明 @if (operation.Value.Responses != null && operation.Value.Responses.Count > 0) { foreach (var response in operation.Value.Responses) { @response.Key @response.Value.Description } } 示例 请求参数 返回值
} } }

将数据遍历到静态页面中,

        ///         /// 将数据遍历静态页面中        ///         /// 静态页面地址        /// 获取到的文件数据        ///         public static string GeneritorSwaggerHtml(string templatePath, OpenApiDocument model)        {            var template = System.IO.File.ReadAllText(templatePath);            var result = Engine.Razor.RunCompile(template, "i3yuan", typeof(OpenApiDocument), model);            return result;        }

三、根据生成的html转work文档

        ///         /// 静态页面转文件        ///         /// 静态页面html        /// 文件类型        /// 上下文类型        ///         public Stream SwaggerConversHtml(string html, string type, out string contenttype)        {            string fileName = Guid.NewGuid().ToString() + type;            //文件存放路径            string webRootPath = _hostingEnvironment.WebRootPath;            string path = webRootPath + @"FilesTempFiles";            var addrUrl = path + $"{fileName}";            FileStream fileStream = null;            var provider = new FileExtensionContentTypeProvider();            contenttype = provider.Mappings[type];            try            {                if (!Directory.Exists(path))                {                    Directory.CreateDirectory(path);                }                var data = Encoding.Default.GetBytes(html);                var stream = ByteHelper.BytesToStream(data);                //创建Document实例                Document document = new Document();                //加载HTML文档                document.LoadFromStream(stream, FileFormat.Html, XHTMLValidationType.None);                //保存为Word                document.SaveToFile(addrUrl, FileFormat.Docx);                document.Close();                fileStream = File.Open(addrUrl, FileMode.OpenOrCreate);                var filedata = ByteHelper.StreamToBytes(fileStream);                var outdata = ByteHelper.BytesToStream(filedata);                return outdata;            }            catch (Exception)            {                throw;            }            finally            {                if (fileStream != null)                    fileStream.Close();                if (File.Exists(addrUrl))                    File.Delete(addrUrl);//删掉文件            }        }
    public class ByteHelper    {        public static byte[] StreamToBytes(Stream stream)        {            byte[] bytes = new byte[stream.Length];            stream.Read(bytes, 0, bytes.Length);            // 设置当前流的位置为流的开始             stream.Seek(0, SeekOrigin.Begin);            return bytes;        }        /// 将 byte[] 转成 Stream        public static Stream BytesToStream(byte[] bytes)        {            Stream stream = new MemoryStream(bytes);            return stream;        }    }

四、最终效果

将html转换为word后,我们就可以看到带有 .doc 的效果了!差不多是如下效果

总结

1. 到这基本就结束了,通过简易的几个接口的方式,展示了如何通过将Swagger接口文档生成word文档。可以根据自己的html模板生成各式的word样式文档说明。

2.写这篇番外主要是因为之前介绍了关于如何使用Swagger生成在线文档,但实际工作中,可能也会遇到这种要各种正式word文档的客户,所以在此分享一些想法和思路,同时希望大家不吝指教。

idea swagger生成接口文档_.NetCore3.1中使用Swagger生成接口文档相关推荐

  1. java 接口鉴权_安全|Java中使用JWT生成Token进行接口鉴权实现

    先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行 ...

  2. oracle中文文档_如果你还在用Swagger(丝袜哥)生成接口文档,那就真有点老“土”了!...

    JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又不得不做的事情,我们都不喜欢写文档,但除非项目前后 ...

  3. python如何读取公共盘的文档_如何使用 Sphinx 给 Python 代码写文档 | Linux 中国

    最好将文档作为开发过程的一部分.Sphinx 加上 Tox,让文档可以轻松书写,并且外观漂亮.-- Moshe Zadka Python 代码可以在源码中包含文档.这种方式默认依靠 docstring ...

  4. java web 操作word文档_Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...

  5. 苹果手机怎么编辑word文档_原创首发:编辑和修改PDF文档,将PDF转换为WORD技巧...

    在之前的文章中介绍了如何将图片合成为PDF文档,今天将为大家介绍下如何编辑和修改PDF文档,以及将PDF转换为WORD的技巧. 使用到工具Adobe Acrobat 编辑和修改PDF 文档 方法1.使 ...

  6. 软件项目文档_什么是软件项目的好的文档?

    软件项目文档 开放地理空间(OSGeo)基金会最近参加了Google的第一个文档季节 ,其中Google赞助了高级技术作家为开源项目做出贡献. OSGeo是大约50个地理空间开源项目的总括组织. 多年 ...

  7. 苹果手机怎么编辑word文档_多人协同编辑一份Word文档用修订功能就对了

    在职场中我们难免会遇到需要与同事协同编辑一份文档的情况 那么如何清晰不混乱地协同编辑呢? 如下图所示,相信不少人在协同编辑文档时都是这样做的,用各种颜色字和括号,写明自己想编辑的内容及要修改的点.一旦 ...

  8. 雷电3接口能干嘛_把雷电3插到TypeC接口了?不认识电脑接口的小伙伴看过来

    大部分用户在选购笔记本时 会关注处理器.显卡.外观.重量等参数 但关注电脑接口的 却少之又少 不过 在使用过程中 一套完整的.设计合理的接口配置 对我们的体验有着非常重要的作用 效率提升不止一点点哦 ...

  9. java接口与集合_【总结】Java常用集合接口与集合类

    目录常见集合接口概述Collection Map Collection接口 Map接口 补充内容 常见集合接口概述 Java中包含许多集合接口.其中比较常见的主要是Collection接口和Map接口 ...

  10. java8的函数式接口的好处_浅谈Java 8 新增函数式接口到底是什么

    从 Java 8 开始便出现了函数式接口(Functional Interface,以下简称FI) 定义为: 如果一个接口只有唯一的一个抽象接口,则称之为函数式接口.为了保证接口符合 FI ,通常会在 ...

最新文章

  1. Intersection of Two Linked Lists——经典问题
  2. python3.7.2教程-python 3.7极速入门教程2 Hello与变量
  3. python教程书籍推荐-买Python入门书籍,我推荐这一本
  4. hibernate 延迟加载的错误 failed to lazily initialize a collection of role
  5. 2020年11月3日 星期二 工作日志 github登陆不了了,晕
  6. html5 --- 使用canvas画一个渐变矩形
  7. char数组拷贝wchar数组
  8. 全面认识UML-类图元素(java)
  9. Redis面试 - 如何保证缓存与数据库的双写一致性?
  10. CentOS5.5下SVN部署文档
  11. 题解【luogu P2421 bzoj P1407 [NOI2002]荒岛野人】
  12. ros多机通讯的办法
  13. linux的审计功能(audit)
  14. 【图像去噪】基于matlab中值+均值+高斯+Laplacian+Sobel+Prewitt图像去噪【含Matlab源码 025期】
  15. Matlab中直方图的绘制histogram函数
  16. python学习2——if语句、elif、if嵌套、while循环、while嵌套
  17. 【C语言】利用队列的思维理解移位运算符和移位函数
  18. 【ThreeJS基础教程-初识Threejs】1.6各种各样的几何体
  19. Kafka集群的安全认证机构 SASL_SCRAM
  20. linux里nohup用法,小飞博客-Linux nohup用法

热门文章

  1. MySQL事务之可重复读
  2. [USACO10FEB]购买巧克力Chocolate Buying
  3. bay——RAC 表空间时数据文件误放置到本地文件系统-介质恢复.txt
  4. java 编程英语单词,语句
  5. php导出数组到csv格式demo
  6. ThinkPHP框架的增删改
  7. oracle 存储过程 基础
  8. android 屏幕宽高
  9. [导入]Reporting Services 6: 在服务器端报表中筛选数据
  10. 一个完整的接口技术解决方案(一)