点击⬇️方“逆锋起笔”,公众号回复 pdf
领取大佬们推荐的学习资料

作者:慢时光

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

一、序言

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

公司有这么两个需求:

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

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

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

1、第一步:PDF制作模板

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

a.Word里面制作模板b.更改名字为 .pdf形式

c.这时需要用到一个叫:Adobe Acrobat DC的软件,具体操作如下:

用Adobe Acrobat DC打开我们刚才改过名字的PDF文件,点击右下角的“更多工具”按钮到下面这个页面再点击“准备表单”按钮d.接下来就需要详细的配置你的数据源了数据源即:你代码中实体类中对应的数据(注意字段一定要一一对应),配置完毕就可以保存进行下面的代码编写工作了。

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导出功能)

a.表头对应实体类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;
}

b.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;
}

c.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;}
}

d.测试

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

参考

https://www.cnblogs.com/wangpeng00700/p/8418594.html

END

推荐好文

最强 Java 15 新特性讲解!突然感觉 Java 8 不香了!

一个 Java 开源商城项目,值得好好研究一下!

华为 Java 编程军规

新版任你发,我用 Java 8

用 Java 写了一个类 QQ 界面聊天小项目,可在线聊天!

点个『在看』支持下

Java 实现 pdf 和 Excel 的生成及数据动态插入、导出相关推荐

  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 实现数据动态插入,生成 PDF、EXECL,完美导出功能!

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

  5. html中循环生成表格数据,动态生成表格(简单实现)

    1.案例分析 1.利用对象生成假的数据,用来模拟数据库的数据. 2.核心算法:利用createElement生成表格(生成 tr , td ),注意逻辑关系. 1.css代码 table th { w ...

  6. Delphi DataSet超高效率导出到Excel——60万个数据9秒导出

    数据库中的数据导出到Excel通常的方式有几种: 1.Ole控件方式,创建一个Excel文档,一个数据一个数据往里面写,该方法效率比较低,数据量大时不可用. 2.使用文件流的方法,直接写Excel文件 ...

  7. java 根据pdf模板表单生成对应pdf(用于荣誉证书等生成)

    代码段 package com.util;import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import j ...

  8. Java 实现pdf转excel

    最近项目需要解析pdf单据,获取里面的字段数据,通过网上的查阅发现itext比pdfbox的文档要多一点,所以选择了itext(不是说pdfbox不好,只是api和例子太少,难以解).因pdf非模板化 ...

  9. Excel表格生成sql数据

    前言 最近项目着急着上线一个新版本,因开发时间太短,暂时直接将数据批量导入数据库,产品方只给了个excel表格,what?虽然并没有过多的接触过excel的使用,但是作为一个有志向的程序员,还是要学会 ...

  10. python excel取数 生成报告_python读取excel表格生成erlang数据

    为了将excel数据自动转换成所需要的erlang数据,听同事说使用python会很方便简单,就自学了两天python,写了一个比较粗糙的python脚本,不过能用,有什么优化的地方请指教 代码如下: ...

最新文章

  1. Linux内核网络数据包发送(四)——Linux netdevice 子系统
  2. 燕赵志愿云如何认证_如何获得云安全专家CCSP认证
  3. MySQL服务器修改主机名后问题解决
  4. sprintf,你知道多少?
  5. android权限控制泄露,Android应用的权限泄露分析
  6. 信息系统项目管理师-项目立项管理考点笔记
  7. 事务相关、不可重复读与幻读的区别
  8. Android JNI入门第六篇——C调用Java
  9. Java中怎么控制线程訪问资源的数量
  10. yum centos 7.4 安装svn服务器
  11. 计算机msoffice怎么复习,全国计算机一级MSoffice怎样复习我在 – 手机爱问
  12. 最新eclipse国内镜像站,比ustc等站点资源新。
  13. 《计算机网络(第七版)谢希仁 编著》部分课后答案
  14. java实现模拟多道程序设计
  15. win7关于无线连接的服务器,win7网络连接受限
  16. 访问网站提示:您未被授权查看该页恢复办法
  17. 两台电脑共享一套键盘鼠标的神器
  18. 前端基础-html-01
  19. 【解决方案】微信公众号文章加载很慢,图片加载不出来,或者weixin.qq.com这个域名都加载不出来
  20. hive drop表恢复手册

热门文章

  1. Arduino - 红外接收
  2. 10HTML5期末大作业:影视在线网站设计——电影网H5(9页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  3. 对象和map的相互转换
  4. STM8L_库函数-模板搭建
  5. w7系统怎么ping服务器,win7系统中如何ping端口命令
  6. python3 txt 读写_Python3 读写txt文件
  7. tif软件Android版下载,TIF文件查看器
  8. 软考高项(信息系统项目管理师)论文范文分享
  9. select获取下拉框的值 下拉框默认选中
  10. 使用dom和jaxen实现一个增删改查的功能;