作者:Tom-shushu

www.cnblogs.com/Tom-shushu/p/14

一、序言

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

公司有这么两个需求:

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

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

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

1、第一步:PDF制作模板

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

a.Word里面制作模板

b.更改名字为 .pdf形式

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

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

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;
}
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的生成、插入、导出功能。

Spring 中的 Controller 和Service是线程安全的吗?SpringBoot+ Dubbo + Mybatis + Nacos +Seata整合来实现Dubbo分布式事务一个 SpringBoot 项目该包含哪些?
发现一款牛逼的IDEA插件:检测代码漏洞,一键修复!
springboot+redis+Interceptor+自定义annotation实现接口自动幂等100W个微信红包封面,速度领取!!!
API接口的安全设计验证:ticket,签名,时间戳牛逼,一份基于SSM框架实现的支付宝支付功能,附完整源代码...
Redis、Kafka或RabbitMQ,哪个更和微服务更般配?点击阅读全文前往微服务电商教程

JAVA实现PDF和EXCEL生成和数据动态插入以及导出相关推荐

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

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

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

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

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

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

  4. java删除数据库表格,《Java:数据库更新excel文件的数据同时删除数据库原来的数据》 excel表格如何删除相同数据库...

    Java:数据库更新excel文件的数据同时删除数据库原来的数据 重新写入blob的byte[],就可以覆盖了....... excel表格怎么检查有重复的数据库 方/步骤 打开需要编辑的Excel表 ...

  5. java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据

    java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据 使用插件:spire.doc 创建工具类,上代码: import com.spire.doc.D ...

  6. java excel data 导入数据_java实现导入导出excel数据

    项目需要,要实现一个导入导出excel的功能,于是,任务驱动着我学习到了POI和JXL这2个java操作Excel的插件. 一.POI和JXL介绍 1.POI:是对所有office资源进行读写的一套工 ...

  7. java使用POI实现Excel批量导入数据。

    1.背景 项目中有使用easypoi,处理常规excel问题,但是现在有个需求,需要动态生成导出的报表字段.同时,根据导入的excel,增加数据信息.(有可能会出现,导入的报表是几天前下载的,不会最新 ...

  8. Java web批量导入excel表格的数据进入数据库的实现

    1.导入poi相关jar包 对于只操作2003及以前版本的excel,只需要导入poi-XXX.jar ,如果还需要对2007及以后版本进行操作,则需要导入 poi-ooxml-XXX.jarpoi- ...

  9. Java mock客户端数据_CatMock: Java 下使用 mock.js 生成虚拟数据

    CatMock CatMock 是一个mock.js的 Java 封装库.使用 JDK 自带的 js 脚本引擎直接调用 mock.js 脚本,实现对 mock.js 的统一. 为什么采用这样的方案? ...

最新文章

  1. java 自带thread分析工具_java自带的jvm分析工具
  2. (17)Zynq FPGA 全局定时器介绍
  3. - 贪心基础入门讲解二——活动安排问题
  4. struts教程笔记2
  5. Chrome 强制显示最小字体为 12px的解决方法
  6. 两台电脑之间实现串口通信
  7. Android11 GPS 流程代码走读
  8. c语言编程对电脑配置的要求,请问学习电脑编程需要什么配置的笔记本电脑?价格多少?...
  9. PyTorch基础:数据处理(数据加载、GPU加速)
  10. Steinitz exchange lemma
  11. C++ TR1 正则表达式
  12. Filter 过滤器的使用
  13. 企业高管和高收入人群必读的税务筹划策略!
  14. Python 输入一个包含多个单词的英文句子
  15. 微信小程序如何开通支付功能?
  16. 神经网络和深度神经网络,深度神经网络类型包括
  17. 神经网络与深度学习笔记(二)正向传播与反向传播
  18. Linux(Ubuntu)系统如何安装Python
  19. Android中禁止WebView滑动
  20. 从零开始折腾个人博客:服务器选择配置

热门文章

  1. STM32定时器之中断延时
  2. ubuntu18输入法繁体输出转简体
  3. 思科VTP(虚拟链路聚合)协议
  4. vulnhub Monitoring: 1
  5. 易语言单窗口单ip教程_手游搬砖经验单窗口单IP防封黄金法则
  6. 计算机网络技术基础拓扑图实验,计算机网络技术实验指导书 4
  7. MFC界面库BCGControlBar v30.0新功能详解:Desktop Alert Window
  8. 3dmax2016软件安装说明
  9. 群控(Group Control Marketing) 其实一早已在美国存在,网絡宣传(Online Marketing) 之手段之一
  10. 工厂生产现场怎样制定6s管理制度?