前言
在上一篇番外篇中,我們已經熟悉了怎樣根據json資料導出word的文檔,生成接口文檔,而在這一篇,将對上一篇進行完善補充,增加多種導出方式,實作更加完善的導出功能。
回顧
1. 擷取swagger接口文檔的json檔案
2. 解析json檔案資料填充到html的表格中
3.根據生成的html轉work文檔
功能
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CZhNmYyEmZ0YjM4MjZzQ2MjVTO0UWZ3YDOlZ2YxYjMj9CX1IzLcdDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.png)
根據生成的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);
}
效果
總結