前言
本來在Swagger的基礎上,前後端開發人員在開發生產期間,可以藉此進行更加便捷的溝通交流。可是總有些時候,遇到一些難纏的,又不講道理,偏偏覺得將Swagger文檔地址丟給客戶會不夠正式!死活要一份word文檔。
可是這個時候,如果接口數量上百個,甚至更多,一個一個手動輸入word,那將是一筆耗時的工作。但卻有什麼辦法可以解決呢?
對了,利用Swagge生成的Json文件轉換為word文檔不就可以了嗎?
思路
1. 獲取Swagger接口文檔的Json文件
2. 解析Json文件數據填充到Html的表格中
3.根據生成的html轉work文檔
開始
一、根據Swagger版本獲取Json數據
1.通過Swagger源碼文件可以看到
可以拿到swagger生成的文檔數據,所以我們可以新建一個控制器SwaggerController.cs,
<code> private readonly SwaggerGenerator _swaggerGenerator;
public SwaggerController(SwaggerGenerator swaggerGenerator)
{
_swaggerGenerator = swaggerGenerator;
}
/// <summary>
/// 導出文件
/// /<summary>
/// <param>文件類型
/// <param>版本號V1
/// <returns>
[HttpGet]
public FileResult ExportWord(string type,string version)
{
string contenttype = string.Empty;
var model = _swaggerGenerator.GetSwagger(version); //1. 根據指定版本獲取指定版本的json對象。
}/<code>
2. 在Startup.cs文件中,利用net core的ioc容器,注入SwaggerGenerator實例化,這樣在後面的調用中可以直接使用這個方法
<code> services.AddScoped<swaggergenerator>(); //注入SwaggerGenerator,後面可以直接使用這個方法/<swaggergenerator>/<code>
二、文件數據填充到Html的表格中
根據上面獲取的model文件數據,這個時候,我們利用Razor文件,結合html的table模板,將數據遍歷填充到頁面中,生成完整的頁面
Html模板
<code>@using Swashbuckle.AspNetCore.Swagger;
<title>Swagger API文檔代碼文件/<title>
<style><br><br> table, table td, table th {<br> border: 1px solid #000000;<br> border-collapse: collapse;<br> }<br><br> table {<br> table-layout: fixed;<br> word-break: break-all;<br> }<br><br> tr {<br> height: 20px;<br> font-size: 12px;<br> }<br> /<style>
Word接口文檔
@Model.Info.Title
接口文檔 @Model.Info.Version
聯繫方式
作者:@Model.Info.Contact.Name
接口描述
@Model.Info.Description
<table>
說明
類型
/<table>
@foreach (var item in Model.Paths)
{
if (item.Value.Operations != null)
{
foreach (var operation in item.Value.Operations)
{
@operation.Value.Summary
<table>
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
}
}
示例
請求參數
返回值
/<table>
}
}
}
/<code>
將數據遍歷到靜態頁面中,
<code> /// <summary>
/// 將數據遍歷靜態頁面中
/// /<summary>
/// <param>靜態頁面地址
/// <param>獲取到的文件數據
/// <returns>
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;
}/<code>
三、根據生成的html轉work文檔
<code> /// <summary>
/// 靜態頁面轉文件
/// /<summary>
/// <param>靜態頁面html
/// <param>文件類型
/// <param>上下文類型
/// <returns>
public Stream SwaggerConversHtml(string html, string type, out string contenttype)
{
string fileName = Guid.NewGuid().ToString() + type;
//文件存放路徑
string webRootPath = _hostingEnvironment.WebRootPath;
string path = webRootPath + @"\\Files\\TempFiles\";
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);//刪掉文件
}
}/<code>
<code> 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;
}
}/<code>
四、最終效果
將html轉換為word後,我們就可以看到帶有 .doc 的效果了!差不多是如下效果
總結
1. 到這基本就結束了,通過簡易的幾個接口的方式,展示瞭如何通過將Swagger接口文檔生成word文檔。可以根據自己的html模板生成各式的word樣式文檔說明。
2.寫這篇番外主要是因為之前介紹了關於如何使用Swagger生成在線文檔,但實際工作中,可能也會遇到這種要各種正式word文檔的客戶,所以在此分享一些想法和思路,同時希望大家不吝指教。
閱讀更多 愛踢狂人 的文章