>>号外:关注“Java精选”公众号,回复“面试资料”,免费领取资料!“Java精选面试题”小程序,3000+ 道面试题在线刷,最新、最全 Java 面试题!

一、序言

Excel、PDF的导出、导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策。

公司有这么两个需求:

需求一、给了一个表单,让把查出来的数据组装到表单中并且提供以PDF格式的下载功能。

需求二、将数据查出来以Excel表格的形式下载下来。

二、Java实现PDF的生成和数据动态插入、导出功能

1、第一步:PDF制作模板

因为PDF常用的软件不让支持编辑,我们就先使用WPS以Word的形式进行编辑制作出与客户需求一样的样式,然后直接另存为 .pdf 的形式如下图所示:

1)Word里面制作模板

2)更改名字为 .pdf形式

3)这时需要用到一个叫:Adobe Acrobat DC的软件(可以白嫖7天^_^),具体操作如下:

用Adobe Acrobat DC打开我们刚才改过名字的PDF文件,点击右下角的“更多工具”按钮

到下面这个页面再点击“准备表单”按钮

4)接下来就需要详细的配置你的数据源了

数据源即:你代码中实体类中对应的数据(注意字段一定要一一对应),配置完毕就可以保存进行下面的代码编写工作了。

2、代码的编写(假定我们实体类什么的都已经编写完成、数据通过前端传入获取、模板位置在E盘根目录下名字为:车辆维修审批单.pdf)
导入jar包:
<!-- PDF导出-->
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version>
</dependency>
实现生成PDF、数据插入、导出
        @RegisterToSMP(serviceDisplay = "预览页面PDF下载")      @RequestMapping(value = "/DM/gwclwxsq/qygl/exportPDF$m=query.service",method =RequestMethod.POST) public String exportPdf(@RequestBody GwclwxsqBean gwclwxsqBean , HttpServletResponse response) throws UnsupportedEncodingException {            // 1.指定解析器System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");String filename="车辆维修审批单.pdf";String path="e:/";response.setContentType("application/pdf");response.setHeader("Content-Disposition", "attachment;fileName="+ URLEncoder.encode(filename, "UTF-8"));OutputStream os = null;PdfStamper ps = null;PdfReader reader = null;try {os = response.getOutputStream();// 2 读入pdf表单reader = new PdfReader(path+ "/"+filename);// 3 根据表单生成一个新的pdfps = new PdfStamper(reader, os);// 4 获取pdf表单AcroFields form = ps.getAcroFields();// 5给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);form.addSubstitutionFont(bf);// 6查询数据================================================Map<String, String> data = new HashMap<String, String>();data.put("commitTime", gwclwxsqBean.getCommitTime());data.put("driver", gwclwxsqBean.getDriver());data.put("carId", gwclwxsqBean.getCarId());data.put("carType", gwclwxsqBean.getCarType());data.put("repairAddress", gwclwxsqBean.getRepairAddress());data.put("repairCost",gwclwxsqBean.getRepairCost());data.put("project", gwclwxsqBean.getProject());data.put("fwbzzxfzrYj", gwclwxsqBean.getFwbzzxfzrYj());data.put("fgldspYj", gwclwxsqBean.getFgldspYj());data.put("remarks", gwclwxsqBean.getRemarks());           // 7遍历data 给pdf表单表格赋值for (String key : data.keySet()) {form.setField(key,data.get(key).toString());}ps.setFormFlattening(true);       log.info("*******************PDF导出成功***********************");} catch (Exception e) {          log.error("*******************PDF导出失败***********************");e.printStackTrace();} finally {try {ps.close();reader.close();os.close();} catch (Exception e) {e.printStackTrace();}}return null;}
3、测试

二、Java实现Excel生成和数据插入、导出

这个比较简单,直接上代码(假定你的实体类、查询什么的都已经写好)注意:实体类一个是你自己的数据实体类还有一个是你导出时表格中对应的实体类

我们以一个真实的公司业务来举个例子(一个统计疫情登记人员信息的Excel导出功能)。

另外,利用注解 + 反射优雅的实现通用 Excel 导入导出(通用版附源码):

利用注解 + 反射优雅的实现通用 Excel 导入导出(通用版附源码)

https://blog.yoodb.com/yoodb/article/detail/1734

1)表头对应实体类ExportYqfkdj.java:
import lombok.Data;/*** description: * @author: zhouhong* @version: V1.0.0* @date: 2021年1月14日 下午3:05:54*/
@Data
public class ExportYqfkdj {/*** 序号*/private Integer xuhao;/*** 姓名*/private String xingming;  /*** 证件号码*/private String zjhm;/*** 联系电话*/private String lxdh;    /*** 申请人工作单位*/private String sqrGzdw;    /*** 是否接触过疑似病例*/private String sfjcgysbl;/*** 当前是否与居家隔离人员同住*/private String sfyjjglrytz;    /*** 当前状态*/private String dqzt;/*** 当前健康状态*/private String dqjkzt;/*** 当前体温*/private String dqtw;/*** 当前所在地址*/private String dqszdz;/*** 当前居住地址*/private String dqjzdz;/*** 提交时间* */private String tjsj;
}
2)Service层
    /*** 导出* @param yqfkdjBean* @author zhouhong* @return * @throws Exception*/@Transactional(rollbackFor = { Exception.class })public DataResult exporYqfkdj(YqfkdjBean yqfkdjBean) throws Exception {DataResult result = new DataResult();List<ExportYqfkdj> list = new ArrayList<ExportYqfkdj>();try {/* 查询导出信息 */result = getYqfkMhCXQuery(yqfkdjBean);SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmssSSS");for (int i = 0; i < result.getTotalcount(); i++) {ExportYqfkdj dmKhfwdcDtjlZxDto = new ExportYqfkdj();dmKhfwdcDtjlZxDto = ObjectUtil.parsePojo(result.getResults().get(i), ExportYqfkdj.class);dmKhfwdcDtjlZxDto.setXuhao(i + 1);list.add(dmKhfwdcDtjlZxDto);}String filepath = "D:/疫情防控信息" + df.format(new Date()) + ".xlsx";if (System.getProperty(YqfkdjUtils.Wjdz.NAME).toLowerCase().startsWith(YqfkdjUtils.Wjdz.LI)|| System.getProperty(YqfkdjUtils.Wjdz.NAME).toLowerCase().startsWith(YqfkdjUtils.Wjdz.LIN)) {filepath = "/home/Tomcat/temp/" + df.format(new Date()) + ".xlsx";}EasyExcel.write(filepath, ExportYqfkdj.class).head(head()).sheet().doWrite(list);result.setResults(list);result.setSuccess(true);result.setMsg(filepath);} catch (Exception e) {result.setSuccess(false);result.setMsg(YqfkdjUtils.Cytx.DCSB);e.printStackTrace();throw e;}return result;}/*** 疫情防控信息导出表头* @author zhouhong* @return List<List<String>>*/private List<List<String>> head() {List<List<String>> list = new ArrayList<List<String>>();List<String> head0 = new ArrayList<String>();head0.add("序号");List<String> head1 = new ArrayList<String>();head1.add("姓名");List<String> head2 = new ArrayList<String>();head2.add("证件号码");List<String> head3 = new ArrayList<String>();head3.add("联系电话");List<String> head4 = new ArrayList<String>();head4.add("工作所在单位");List<String> head5 = new ArrayList<String>();head5.add("是否接触疑似病例");List<String> head6 = new ArrayList<String>();head6.add("是否与隔离人员同住");List<String> head7 = new ArrayList<String>();head7.add("当前状态");List<String> head8 = new ArrayList<String>();head8.add("当前健康状态");List<String> head9 = new ArrayList<String>();head9.add("体温(°C)");List<String> head10 = new ArrayList<String>();head10.add("当前所在地址");List<String> head11 = new ArrayList<String>();head11.add("当前居住地址");List<String> head12 = new ArrayList<String>();head12.add("提交时间");list.add(head0);list.add(head1);list.add(head2);list.add(head3);list.add(head4);list.add(head5);list.add(head6);list.add(head7);list.add(head8);list.add(head9);list.add(head10);list.add(head11);list.add(head12);return list;}
3)Controller层
    @RegisterToSMP(serviceDisplay = "疫情防控查询导出")@RequestMapping(value = "/DM/yqfkdj/gr/yqfkdjdc$m=export.service", method = RequestMethod.POST)public void exportKhfxxx(@RequestBody YqfkdjBean yqfkdjBean, HttpServletResponse resp) throws Exception {DataResult result = new DataResult();try {SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmssSSS");result = yqfkdjService.exporYqfkdj(yqfkdjBean);String filepath = result.getMsg().replace("\"", "");File file = new File(filepath);String filename = "疫情防控信息" + df.format(new Date()) + ".xlsx";InputStream fis = new BufferedInputStream(new FileInputStream(filepath));byte[] buffer = new byte[fis.available()];fis.read(buffer);fis.close();resp.reset();resp.setHeader("Content-Disposition","attachment;filename=" + new String(filename.replaceAll(" ", "").getBytes("gbk")));resp.setHeader("Content-Length", "" + file.length());OutputStream os = new BufferedOutputStream(resp.getOutputStream());resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");// 输出文件os.write(buffer);os.flush();os.close();} catch (Exception e) {e.printStackTrace();log.info(YqfkdjUtils.Cytx.DCSB);throw e;}}
4)测试

已经全部完成PDF和Excel的生成、插入、导出功能。

作者:Tom-shushu

cnblogs.com/Tom-shushu/p/14279357.html

往期精选  点击标题可跳转

利用注解 + 反射优雅的实现通用 Excel 导入导出(通用版附源码)

再议 String - 字符串常量池与 String.intern() 的应用

记录一次因索引合并,结果导致 MySQL 死锁了,过程分析!

知乎热评:你做 Java 程序员真的是因为热爱吗?

Elasticsearch 7.13.4 发布,修复内存泄漏漏洞

Spring Boot 项目 @Value 注解太强大了,使用者无不称赞!

Java 8 “失宠”,开发人员逐渐向 Java 11 转移!

Spring Boot 整合:Redis 延时队列的实现方案(基于有赞的设计)

刘强东刷屏了,一片好评。京东宣布全员涨薪两个月!

单点登录 SSO 完美解决方案:SpringSecurity JWT(完整教程)

【附源码】使用 ZooKeeper 实现分布式队列、分布式锁和选举详解!

Redis 大数据量(百亿级)Key 存储需求及解决方案

点个赞,就知道你“在看”!

硬核!Java 实现数据动态插入,生成 PDF、EXECL,完美导出功能!相关推荐

  1. Java实现pdf和Excel的生成及数据动态插入、导出

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 作者:慢时光 cnblogs.com/Tom-shushu/ ...

  2. Java技术:实现pdf和Excel的生成及数据动态插入、导出

    1 序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策. 公司有这么两个需求: 需求一.给了一个表单,让把 ...

  3. JAVA实现PDF和EXCEL生成和数据动态插入以及导出

    作者:Tom-shushu www.cnblogs.com/Tom-shushu/p/14 一.序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便 ...

  4. 超硬核Java学习路线图+学习资源+实战项目汇总,看完以后不用再问我怎么学Java了!

    之前写过很多次关于Java学习指南.Java技术路线图的文章.但是总还是有小伙伴来问我,Java怎么学,项目怎么做,资源怎么找,真是让人头秃. 于是这次黄小斜决定来一波狠的,把所有这些内容都整理起来, ...

  5. 全网最硬核 Java 新内存模型解析与实验 - 4. Java 新内存访问方式与实验

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  6. 全网最硬核 Java 新内存模型解析与实验 - 3. 硬核理解内存屏障(CPU+编译器)

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  7. 全网最硬核 Java 新内存模型解析与实验 - 2. 原子访问与字分裂

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  8. 全网最硬核 Java 新内存模型解析与实验 - 1. 什么是 Java 内存模型

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  9. java根据模板生成pdf文件并导出(iText)

    java根据模板生成pdf文件并导出 首先你的制作一个pdf模板: 1.先用word做出模板界面 2.文件另存为pdf格式文件 3.通过Adobe Acrobat pro软件打开刚刚用word转换成的 ...

最新文章

  1. CUDA功能和通用功能
  2. Altium Designer原理图元件和PCB元件互相定位
  3. java hive 查询语句,使用java连接hive,并执行hive语句详解
  4. MyBatis设计模式总结
  5. Ubuntu 16.04 LTS apt-get connect refuse Unable to connect to 127.0.0.1:1080
  6. SAP CDS view源代码行数统计工具
  7. 分布式解决方案之分布式日志采集elk+kafka 环境的构建
  8. mysql查询操作的5种子句
  9. APACHE OFBIZ XML-RPC 反序列化漏洞 (CVE-2020-9496) 的复现与分析
  10. Android环绕地球动画,手机也能带你进入360°全景立体影音世界?---杜比全景声体验全接触...
  11. 商品包含资源和劳动两部分内容
  12. 线性定常系统的离散化
  13. 你真的懂Java怎么输出Hello World吗?
  14. 《呼吸法门精要》南师所讲。读后感
  15. 1024 程序员节,拿个勋章
  16. java wsdl 参数必填设置
  17. Android打开系统设置界面
  18. oracle 修改lsnrctl,Oracle中 lsnrctl命令使用总结(推荐)
  19. Excel VBA Sheet1和Sheets(1)的区别
  20. c++:利用socket基于TPC/IP实现通信 在线聊天

热门文章

  1. 纯小白如何进入游戏行业?看这篇就够了!
  2. C#点击关闭按钮 弹出确认框
  3. MIL边缘检查实战2.0 20220307
  4. python 常见错误提示
  5. word转PDF、image
  6. 移动端互动直播(入门篇)
  7. 如何高效学习-斯科特杨 读书总结
  8. JVM性能监控工具 - jstat
  9. 【调剂】湖南工业大学湖南省重点实验室急招生物医学工程、计算机与基础医学相关硕士研究生...
  10. 42个激发灵感、漂亮的登陆页面设计