excel模板报表转PDF下载
时间:2019-06-17
本文章向大家介绍excel模板报表转PDF下载,主要包括excel模板报表转PDF下载使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最近有一个需求,需要根据excel模板PDF报表;需要先根据excel模板生成excel文件,再由excel生成pdf文件,最后下载功;
生成excel报表
使用
easypoi
组件,详细可参考文档中excel模板部分;
使用方法概述
该方式的优势为样式与模板样式完全一致,可以实现单值属性与列表遍历;
- 在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服务器上的唯一选择.
windowOffice 或 wps
导入jar包: jacob-1.19.zip
安装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服务器;
文件下载
后端下载基础代码
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等);
原文地址:https://www.cnblogs.com/417xiaoliu/p/11039102.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CodeForces - 140A New Year Table (几何题)当时没想出来-----补题
- PostgreSQL vacuum可见性
- PostgreSQL VFD机制
- POJ 2136 Vertical Histogram(当时写的比较恶心,优化一下)
- PostgreSQL 12的可拔插存储引擎--表访问方法以及bloackholes案例
- POJ 2230 Watchcow 欧拉回路的DFS解法(模板题)
- POJ 2188 Cow Laundry
- 51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划
- 51 NOD 1049 最大子段和 动态规划 模板 板子 DP
- 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
- CodeForces - 262C 贪心
- 花狗C语言彩色贪吃蛇(完整代码)
- CodeForces - 262B
- CodeForces - 260B
- 蓝桥杯第九届C语言C组第一题:哪天返回