最近有一個需求,須要根據excel模板PDF報表;須要先根據excel模板生成excel文件,再由excel生成pdf文件,最後下載功;前端
使用
easypoi
組件,詳細可參考文檔中excel模板部分;linux
該方式的優點爲樣式與模板樣式徹底一致,能夠實現單值屬性與列表遍歷;ajax
easypoi
支持的表達式;TemplateParam
(模板屬性)和數據屬性;ExcelExportUtil.exportExcel
純JAVA實現的PDF生成方法,跨平臺,缺點也很明顯:API比較難用,同時很難處理Excel的樣式;後端
導入jar包: com.artofsolving-jodconverter瀏覽器
openOffice監聽端口:soffice.exe -headless -accept="socket,host=%s,port=%s;urp;" -nofirststartwizard
服務器
//鏈接 var conn = new SocketOpenOfficeConnection(hostname,port); conn.connect(); //轉換 converter = new OpenOfficeDocumentConverter(conn); converter.convert(docFile,pdfFile); //關閉鏈接 conn.disconnect();
優點: 跨平臺;
缺點: openOffice轉換成的PDF在必定程度失真,好比excel邊框自動加粗等,某一些樣式不支持等,可是linux服務器上的惟一選擇.app
導入jar包: jacob-1.19.zipless
安裝windowOffice或wps;前後端分離
//office命令 ActiveXComponent app = new ActiveXComponent("Excel.Application"); //Wps方式 app = new ActiveXComponent("KET.Application"); app.setProperty("Visible", false); Dispatch excels = app.getProperty("Workbooks").toDispatch(); excel = Dispatch.call(excels, "Open", path, false, true).toDispatch(); Dispatch.call(excel, "ExportAsFixedFormat", 0, pdfAbsPath);
優勢: 完美的樣式;
缺點: 僅支持window服務器;socket
response.setCharacterEncoding(CharsetUtil.UTF_8); response.setContentType("application/pdf"); response.setHeader("Content-Disposition","attachment; filename=" + fileName); response.setContentLengthLong(pdfFile.length());
config.responseType = "blob"; let blob = new Blob([response.data],{type: 'application/pdf'}); //建立一個blob對象 let downloadName = response.headers["content-disposition"].split(";")[1].split("filename=")[1]; let a = document.createElement('a'); let url = URL.createObjectURL(blob) a.href = url; // response is a blob a.download = downloadName; //文件名稱 a.style.display = 'none'; document.body.appendChild(a); a.click(); a.remove();
缺點: 在safari中出現下載文件名爲:known的異常;
該方法是上一種方法的擴展,不本身建立a標籤,使用file-sever組件,只須要傳入blob對象便可;
FileSaver.saveAs(blob, downloadName);
缺點: 在safari中出現下載文件名爲:known的異常;
let a = document.createElement('a'); a.href = url; // 直接爲後端的url; a.style.display = 'none'; document.body.appendChild(a); a.click(); a.remove();
優勢:理論上全部瀏覽器都可正確識別文件名信息; 缺點: 由於不是經過ajax請求的後端接口,在先後端分離系統中要單獨處理權限驗證的東西(如token等);