• 一、序言

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

    • 1、第一步:PDF制作模板

    • 2、代码的编写(假定我们实体类什么的都已经编写完成、数据通过前端传入获取、模板位置在E盘根目录下名字为:车辆维修审批单.pdf)

    • 3.测试

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

    • 1.表头对应实体类ExportYqfkdj.java:

    • b.Service层

    • c.Controller层

    • d.测试

一、序言

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


关注我,每天分享更多干货

生成 Excel + PDF 导出,用 Java 怎么实现?相关推荐

  1. 接了个变态需求:生成 Excel + PDF 导出,用 Java 怎么实现?

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 6.5 钟. 来自:cnblogs.com/Tom-shushu/p/14279357.html 一.序言 Excel.PDF ...

  2. java 生成Excel文件导出

    Hutool工具类中有关于excel导出的工具类,非常好用 第一步,我们先导入依赖 <dependency><groupId>cn.hutool</groupId> ...

  3. java excel导出 jxl_JAVA利用JXL导出/生成 EXCEL

    jxl是java操作excel的工具, 在开源世界中,有两套比较有影响的API可 供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支持非常好,A ...

  4. java jxl 创建excel_JAVA利用JXL导出/生成 EXCEL

    jxl是java操作excel的工具, 在开源世界中,有两套比较有影响的API可 供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支持非常好,A ...

  5. pandas后台导出excel_利用pandas将numpy数组导出生成excel

    代码 # -*- coding: utf- -*- """ Created on Sun Jun :: @author: Bruce Lau ""&q ...

  6. java poi pdf 导出

    java poi pdf 导出 (java poi pdf导出 文字+图片两张放置一行) 思路:流传入图片 ,pdf没有行的概念,只有列即为一行,两张图片可以先建立一列在一列总再建立两列各放置一张图片 ...

  7. 人工智能-pands数据框架基本操作 以及查询sql生成excel表格

    #导包 import os import sys 脚本式调用Django #将脚本所在工程添加到环境变量 sys.path.append('../../mymacwjy') #将项目路劲添加到系统搜寻 ...

  8. java ajax 导出excel文件_springMVC(4)---生成excel文件并导出

    springMVC(4)---生成excel文件并导出 在开发过程中,需要将数据库中的数据以excel表格的方式导出. 首先说明.我这里用的是Apache的POI项目,它是目前比较成熟的HSSF接口, ...

  9. java的json导出excel_利用json生成excel表格

    起因: 之前利用反射生成excel导出,这个组件本来挺好用的,结果,坑爹的本地研发没有问题,生产环境却有问题.不知道什么原因直接导致服务重启,还重新加载类,直接导致jvm的永久区内存溢出. 异常: j ...

最新文章

  1. 写给自己的web开发资源
  2. 计算掩码、网络地址(最小主机地址,最高主机地址)、广播地址、IP地址范围、主机号...
  3. 特性开关框架 java_关于Mosfet你应当知道的开关特性
  4. redmine上传大文件报错Request Entity Too Large
  5. JS 清空table
  6. 编译原理—词法分析器(Java)
  7. erase函数的用法
  8. 关于html 音乐播放器代码|音乐播放器网页代码大全(转),关于HTML 音乐播放器代码|音乐播放器网页代码大全...
  9. 项目周期所涉及到的文档控制说明
  10. 华为举办首届用户精英论坛,携手共创数据存储新未来
  11. Python编写csdn刷博客数量软件
  12. Can‘t connect to any repository: 的解决办法, 在Push代码,提交代码到代码仓库的时候,提示不能连接到该代码仓库
  13. 移动硬盘无法访问怎么办?还能恢复数据吗?
  14. day01 Redis
  15. 英译汉文章在线翻译器:批量翻译、素材收集、图片处理
  16. sendto()_Linux C函数
  17. 天翼云等服务器配置Apache Web服务
  18. 七个必学的“RPA功能组件”技巧,把时间用在刀刃上
  19. Linux无文件木马程序渗透测试复现
  20. 字符串算术表达式求值-简单计算器实现(栈)-数据结构和算法(Java)

热门文章

  1. 【智能制造】工业4.0——从智慧工厂到智能生产
  2. 拍拍抢拍精灵 --腾讯拍拍秒杀器--截图
  3. 让服装讲述中国古典之美-皇家墨尔本理工大学(RMIT University)服装设计专业优秀中国校友...
  4. 点分十进制与unsigned int 32互转
  5. Xshell工具下载
  6. 【如何学习CAN总线测试】——UDS诊断测试(网络层)
  7. 计算机职业规划书word格式,计算机专业职业生涯规划书.doc
  8. html5制作线路图,HTML5使用canvas画简单电路图
  9. 中科协发布2022“科创中国”开源创新榜 OceanBase开源社区入选
  10. yii2 打开GII 的配置