excel模板報表轉PDF下載

最近有一個需求,須要根據excel模板PDF報表;須要先根據excel模板生成excel文件,再由excel生成pdf文件,最後下載功;前端

生成excel報表

使用easypoi組件,詳細可參考文檔中excel模板部分;linux

使用方法概述

該方式的優點爲樣式與模板樣式徹底一致,能夠實現單值屬性與列表遍歷;ajax

  • 在excel模板中修改單元格內容爲相應的easypoi支持的表達式;
  • 定義TemplateParam(模板屬性)和數據屬性;
  • 調用靜態方法:ExcelExportUtil.exportExcel

excel生成PDF報表

實現方式種類

IText

純JAVA實現的PDF生成方法,跨平臺,缺點也很明顯:API比較難用,同時很難處理Excel的樣式;後端

OpenOffice
  • 導入jar包: com.artofsolving-jodconverter瀏覽器

  • openOffice監聽端口:soffice.exe -headless -accept="socket,host=%s,port=%s;urp;" -nofirststartwizard服務器

  • 使用openOffice轉換爲PDF
//鏈接
            var conn = new SocketOpenOfficeConnection(hostname,port);
            conn.connect();
            //轉換
            converter = new OpenOfficeDocumentConverter(conn);
            converter.convert(docFile,pdfFile);
            //關閉鏈接
            conn.disconnect();

優點: 跨平臺;
缺點: openOffice轉換成的PDF在必定程度失真,好比excel邊框自動加粗等,某一些樣式不支持等,可是linux服務器上的惟一選擇.app

windowOffice 或 wps

  • 導入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());

注意事項

  • 不一樣瀏覽器支持的文件名編碼格式不一樣,大部分使用UrlEnocde編碼便可,safari瀏覽器須要ISO8859-1的字符串編碼

前端處理

前端使用js下載blob,並建立blob的下載地址
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等);

相關文章
相關標籤/搜索