天天看點

基于.NetCore3.1搭建項目系列 —— 使用Swagger導出文檔 (補充篇)

前言

  在上一篇番外篇中,我們已經熟悉了怎樣根據json資料導出word的文檔,生成接口文檔,而在這一篇,将對上一篇進行完善補充,增加多種導出方式,實作更加完善的導出功能。

回顧

  1. 擷取swagger接口文檔的json檔案

  2. 解析json檔案資料填充到html的表格中

  3.根據生成的html轉work文檔

功能

基于.NetCore3.1搭建項目系列 —— 使用Swagger導出文檔 (補充篇)
開始

 根據生成的html轉work文檔

/// <summary>
        /// 靜态頁面轉檔案
        /// </summary>
        /// <param name="html">靜态頁面html</param>
        /// <param name="type">檔案類型</param>
        /// <param name="contenttype">上下文類型</param>
        /// <returns></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);

                switch (type)
                {
                    case ".docx":
                        document.savetofile(addrurl, fileformat.docx);
                        break;
                    case ".pdf":
                        document.savetofile(addrurl, fileformat.pdf);
                        break;
                    case ".html":
                        //document.savetofile(addrurl, fileformat.html);
                        //當然了,html 如果不用spire,也可以直接生成
                        filestream fs = new filestream(addrurl, filemode.append, fileaccess.write, fileshare.none);//html直接寫入不用spire.doc
                        streamwriter sw = new streamwriter(fs); // 建立寫入流
                        sw.writeline(html); // 寫入hello world
                        sw.close(); //關閉檔案
                        fs.close();
                        break;
                    case ".xml":
                        document.savetofile(addrurl, fileformat.xml);
                        break;
                    case ".svg":
                        document.savetofile(addrurl, fileformat.svg);
                        break;
                    default:
                        //儲存為word
                        document.savetofile(addrurl, fileformat.docx);
                        break;
                }
                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);//删掉檔案
            }
        }      

增加導出按鈕

//加載自定義導出按鈕
function loadexportapiwordbtn() {
    $(".information-container").height(240);
    $(".topbar").height(35);
    var btnexport = "<div class='selectbox' style='position: absolute;margin: 0;padding: 0;margin-left: 1432px;top: 2.5px;'>" +
        "<span><a href='javascript:void(0);'>導出離線文檔</a></span>" +
        "<div class='drop'>" +
        "<ul style='margin: 0;padding: 0;'>" +
        "<li>" +
        "<a href='javascript:void(0);' onclick='exportapiword(1)'>導出 word</a>" +
        "</li>" +
        "<li>" +
        "<a href='javascript:void(0);' onclick='exportapiword(2)'>導出 pdf</a>" +
        "</li>" +
        "<li>" +
        "<a href='javascript:void(0);' onclick='exportapiword(3)'>導出 html</a>" +
        "</li >" +
        "<li>" +
        "<a href='javascript:void(0);' onclick='exportapiword(4)'>導出 xml</a>" +
        "</li >" +
        "<li>" +
        "<a href='javascript:void(0);' onclick='exportapiword(5)'>導出 svg</a>" +
        "</li >" +
        "</ul >" +
        "</div >" +
        "</div >";
    //information-container這個元素是swagger後期動态渲染出來的,所有這裡要加個循環判斷。
    //第一次進來如果有這個class直接加載按鈕退出
    if ($("*").hasclass("information-container")) {
        $(".information-container").append(btnexport);
        return;
    }
    //沒有元素等待元素出現在加載按鈕
    timerloadexportbtn = setinterval(function () {
        if ($("*").hasclass("information-container")) {
            $(".information-container").append(btnexport);
            console.log("load ok");
            window.clearinterval(timerloadexportbtn);
            return;
        }
        console.log("loading");
    }, 788);
}      

效果

總結

繼續閱讀