前言

在上一篇导出文档番外篇中,我们已经熟悉了怎样根据json数据导出word的文档,生成接口文档,而在这一篇,将对上一篇进行完善补充,增加多种导出方式,实现更加完善的导出功能。

回顾

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

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

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

功能

开始

根据生成的html转work文档

  1. /// <summary>
  2. /// 静态页面转文件
  3. /// </summary>
  4. /// <param name="html">静态页面html</param>
  5. /// <param name="type">文件类型</param>
  6. /// <param name="contenttype">上下文类型</param>
  7. /// <returns></returns>
  8. public Stream SwaggerConversHtml(string html, string type, out string contenttype)
  9. {
  10. string fileName = Guid.NewGuid().ToString() + type;
  11. //文件存放路径
  12. string webRootPath = _hostingEnvironment.WebRootPath;
  13. string path = webRootPath + @"\Files\TempFiles\";
  14. var addrUrl = path + $"{fileName}";
  15. FileStream fileStream = null;
  16. var provider = new FileExtensionContentTypeProvider();
  17. contenttype = provider.Mappings[type];
  18. try
  19. {
  20. if (!Directory.Exists(path))
  21. {
  22. Directory.CreateDirectory(path);
  23. }
  24. var data = Encoding.Default.GetBytes(html);
  25. var stream = ByteHelper.BytesToStream(data);
  26. //创建Document实例
  27. Document document = new Document();
  28. //加载HTML文档
  29. document.LoadFromStream(stream, FileFormat.Html, XHTMLValidationType.None);
  30.  
  31. switch (type)
  32. {
  33. case ".docx":
  34. document.SaveToFile(addrUrl, FileFormat.Docx);
  35. break;
  36. case ".pdf":
  37. document.SaveToFile(addrUrl, FileFormat.PDF);
  38. break;
  39. case ".html":
  40. //document.SaveToFile(addrUrl, FileFormat.Html);
  41. //当然了,html 如果不用spire,也可以直接生成
  42. FileStream fs = new FileStream(addrUrl, FileMode.Append, FileAccess.Write, FileShare.None);//html直接写入不用spire.doc
  43. StreamWriter sw = new StreamWriter(fs); // 创建写入流
  44. sw.WriteLine(html); // 写入Hello World
  45. sw.Close(); //关闭文件
  46. fs.Close();
  47. break;
  48. case ".xml":
  49. document.SaveToFile(addrUrl, FileFormat.Xml);
  50. break;
  51. case ".svg":
  52. document.SaveToFile(addrUrl, FileFormat.SVG);
  53. break;
  54. default:
  55. //保存为Word
  56. document.SaveToFile(addrUrl, FileFormat.Docx);
  57. break;
  58. }
  59. document.Close();
  60. fileStream = File.Open(addrUrl, FileMode.OpenOrCreate);
  61. var filedata = ByteHelper.StreamToBytes(fileStream);
  62. var outdata = ByteHelper.BytesToStream(filedata);
  63. return outdata;
  64. }
  65. catch (Exception)
  66. {
  67. throw;
  68. }
  69. finally
  70. {
  71. if (fileStream != null)
  72. fileStream.Close();
  73. if (File.Exists(addrUrl))
  74. File.Delete(addrUrl);//删掉文件
  75. }
  76. }

增加导出按钮

  1. //加载自定义导出按钮
  2. function LoadExportApiWordBtn() {
  3. $(".information-container").height(240);
  4. $(".topbar").height(35);
  5. var btnExport = "<div class='selectBox' style='position: absolute;margin: 0;padding: 0;margin-left: 1432px;top: 2.5px;'>" +
  6. "<span><a href='javascript:void(0);'>导出离线文档</a></span>" +
  7. "<div class='drop'>" +
  8. "<ul style='margin: 0;padding: 0;'>" +
  9. "<li>" +
  10. "<a href='javascript:void(0);' onclick='ExportApiWord(1)'>导出 Word</a>" +
  11. "</li>" +
  12. "<li>" +
  13. "<a href='javascript:void(0);' onclick='ExportApiWord(2)'>导出 PDF</a>" +
  14. "</li>" +
  15. "<li>" +
  16. "<a href='javascript:void(0);' onclick='ExportApiWord(3)'>导出 Html</a>" +
  17. "</li >" +
  18. "<li>" +
  19. "<a href='javascript:void(0);' onclick='ExportApiWord(4)'>导出 Xml</a>" +
  20. "</li >" +
  21. "<li>" +
  22. "<a href='javascript:void(0);' onclick='ExportApiWord(5)'>导出 Svg</a>" +
  23. "</li >" +
  24. "</ul >" +
  25. "</div >" +
  26. "</div >";
  27. //information-container这个元素是swagger后期动态渲染出来的,所有这里要加个循环判断。
  28. //第一次进来如果有这个class直接加载按钮退出
  29. if ($("*").hasClass("information-container")) {
  30. $(".information-container").append(btnExport);
  31. return;
  32. }
  33. //没有元素等待元素出现在加载按钮
  34. timerLoadExportBtn = setInterval(function () {
  35. if ($("*").hasClass("information-container")) {
  36. $(".information-container").append(btnExport);
  37. console.log("load ok");
  38. window.clearInterval(timerLoadExportBtn);
  39. return;
  40. }
  41. console.log("loading");
  42. }, 788);
  43. }

效果

总结

1. 通过Swagger 导出各类的说明文档,可以根据自己的html模板生成各式的word样式文档说明。

2 .注:搜索关注公众号【DotNet技术谷】--回复【文档生成器】,可获取本篇Swagger生成文档文件。

3. 参考资料:Spire.Doc文件 、Swagger开源地址

4.源码下载

基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (补充篇)的更多相关文章

  1. 基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (番外篇)

    前言 回顾之前的两篇Swagger做Api接口文档,我们大体上学会了如何在net core3.1的项目基础上,搭建一套自动生产API接口说明文档的框架. 本来在Swagger的基础上,前后端开发人员在 ...

  2. 基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (上篇)

    前言 为什么在开发中,接口文档越来越成为前后端开发人员沟通的枢纽呢? 随着业务的发张,项目越来越多,而对于支撑整个项目架构体系而言,我们对系统业务的水平拆分,垂直分层,让业务系统更加清晰,从而产生一系 ...

  3. 基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (下篇)

    前言 回顾上一篇文章<使用Swagger做Api文档 >,文中介绍了在.net core 3.1中,利用Swagger轻量级框架,如何引入程序包,配置服务,注册中间件,一步一步的实现,最终 ...

  4. JavaWeb项目中集成Swagger API文档

    1.增加依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-sw ...

  5. ABP框架搭建项目系列教程基础版完结篇

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...

  6. 分享一个集成在项目中的REST APIs文档框架swagger

    1 为什么是使用swagger? 1-1 当后台开发人员开发好接口,是不是还要重新书写一份接口文档提给前端人员,当然对于程序员最不喜欢的就是书写文档(当然文档是必须的,有利于项目的维护) 1-2 当后 ...

  7. 使用Swagger 搭建高可读性ASP.Net WebApi文档

    一.前言 在最近一个商城项目中,使用WebApi搭建API项目.但开发过程中,前后端工程师对于沟通接口的使用,是非常耗时的.之前也有用过Swagger构建WebApi文档,但是API文档的可读性并不高 ...

  8. springboot+swagger接口文档企业实践(上)

    目录 1.引言 2.swagger简介 2.1 swagger 介绍 2.2 springfox.swagger与springboot 3. 使用springboot+swagger构建接口文档 3. ...

  9. Spring系列(零) Spring Framework 文档中文翻译

    Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...

随机推荐

  1. vux中表单验证,在提交时自动聚焦到未验证通过的那栏;及循环表单的验证

    首先vux中的表单验证在点击触发,失焦时才显示错误信息,如果不管它,它就没反应,这显然是不合理的:解决办法就是:在提交时做验证,不通过的话就使用.focus()及.blur()方法给它聚焦,失焦. i ...

  2. iview Checkbox 多选框 单个的时候 如果需要change 以后进行赋值 就要用value 不要用v-modal 然后用updateModel 方法

    noSuchSituationSetFalse () { this.noSuchSituationOne = false this.$refs.noSuchSituationRef.updateMod ...

  3. 龙生九子-浅谈Java的继承

    龙生九子-浅谈Java的继承 书接上回,我们之前谈过了类和对象的概念,今天我来讲一讲面向对象程序设计的另外一个基本概念-继承 目录 为什么需要继承 自动转型与强制转型 继承能干啥 复写和隐藏 supe ...

  4. java-方法。(新手)

    import java.util.ArrayList; //导入包.import java.util.Iterator;import java.util.LinkedList;import java. ...

  5. C++类复习及新的认识 6.1.1+6.1.2内容(适合看过一遍书的新手)

    作者水平有限,文字表述大多摘抄课本,源码部分由课本加自己改编而成,所有代码均在vs2019中编译通过 定义类操作 class Tdate { public: void Set(int m, int d ...

  6. The instance of entity type 'manager' cannot be tracked because another instance with the same key value for {'id'} is already being tracked. When attaching existing entities, ensure that only one ent

    最近在用ASP.NET CORE时遇到一些问题,现记录下: 出现上述错误,即在更新实体数据时出现的错误 services.AddDbContext<StoreContext>(c => ...

  7. 记一次有趣的thinkphp代码执行

    0x00 前言 朋友之前给了个站,拿了很久终于拿下,简单记录一下. 0x01 基础信息 漏洞点:tp 5 method 代码执行,payload如下 POST /?s=captcha _method= ...

  8. windows10删除用户头像

    点击开始菜单,然后这里我们点击最上方的用户,弹出的界面,点击这里的更改帐户设置,大家如图进行操作,点击这里即可.   这里我们通过浏览可以修改自己的账户头像,问题是怎么删除这里使用过的账户头像呢?这里 ...

  9. UVa 11059 最大乘积 java 暴力破解

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  10. canvas技术概述

    canvas简介 在学习一项新技术之前,先了解这项技术的历史发展及成因会帮助我们更深刻的理解这项技术. 历史上,canvas最早是由Apple Inc. 提出的,在Mac OS X webkit中创建 ...