我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

公司有这么两个需求:

需求一、给了一个表单,让把查出来的数据组装到表单中并且提供以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包:

  1.  
  2.     com.itextpdfgroupId> 
  3.     itextpdfartifactId> 
  4.     5.5.13version> 
  5. dependency> 

 实现生成PDF、数据插入、导出

  1. @RegisterToSMP(serviceDisplay = "预览页面PDF下载")       
  2. @RequestMapping(value = "/DM/gwclwxsq/qygl/exportPDF$m=query.service",method =RequestMethod.POST)  
  3. public String exportPdf(@RequestBody GwclwxsqBean gwclwxsqBean , HttpServletResponse response) throws UnsupportedEncodingException {             
  4.     // 1.指定解析器 
  5.     System.setProperty("javax.xml.parsers.DocumentBuilderFactory"
  6.             "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); 
  7.     String filename="车辆维修审批单.pdf"
  8.     String path="e:/"
  9.     response.setContentType("application/pdf"); 
  10.     response.setHeader("Content-Disposition""attachment;fileName=" 
  11.             + URLEncoder.encode(filename, "UTF-8")); 
  12.     OutputStream os = null
  13.     PdfStamper ps = null
  14.     PdfReader reader = null
  15.     try { 
  16.         os = response.getOutputStream(); 
  17.         // 2 读入pdf表单 
  18.         reader = new PdfReader(path+ "/"+filename); 
  19.         // 3 根据表单生成一个新的pdf 
  20.         ps = new PdfStamper(reader, os); 
  21.         // 4 获取pdf表单 
  22.         AcroFields form = ps.getAcroFields(); 
  23.         // 5给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示 
  24.         BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1"
  25.                       BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
  26.         form.addSubstitutionFont(bf); 
  27.         // 6查询数据================================================ 
  28.         Map data = new HashMap(); 
  29.               data.put("commitTime", gwclwxsqBean.getCommitTime()); 
  30.               data.put("driver", gwclwxsqBean.getDriver()); 
  31.               data.put("carId", gwclwxsqBean.getCarId()); 
  32.               data.put("carType", gwclwxsqBean.getCarType()); 
  33.               data.put("repairAddress", gwclwxsqBean.getRepairAddress()); 
  34.               data.put("repairCost",gwclwxsqBean.getRepairCost()); 
  35.               data.put("project", gwclwxsqBean.getProject()); 
  36.               data.put("fwbzzxfzrYj", gwclwxsqBean.getFwbzzxfzrYj()); 
  37.               data.put("fgldspYj", gwclwxsqBean.getFgldspYj()); 
  38.               data.put("remarks", gwclwxsqBean.getRemarks());            
  39.          // 7遍历data 给pdf表单表格赋值 
  40.         for (String key : data.keySet()) { 
  41.             form.setField(key,data.get(key).toString()); 
  42.         } 
  43.         ps.setFormFlattening(true);        
  44.         log.info("*******************PDF导出成功***********************"); 
  45.     } catch (Exception e) {          log.error("*******************PDF导出失败***********************"); 
  46.         e.printStackTrace(); 
  47.     } finally { 
  48.         try { 
  49.             ps.close(); 
  50.             reader.close(); 
  51.             os.close(); 
  52.         } catch (Exception e) { 
  53.             e.printStackTrace(); 
  54.         } 
  55.     } 
  56.     return null

 3 测试

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

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

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

a.表头对应实体类ExportYqfkdj.java

  1. import lombok.Data; 
  2.  
  3.  
  4. @Data 
  5. public class ExportYqfkdj { 
  6.      
  7.     private Integer xuhao; 
  8.      
  9.     private String xingming;   
  10.      
  11.     private String zjhm; 
  12.      
  13.     private String lxdh;     
  14.      
  15.     private String sqrGzdw;     
  16.      
  17.     private String sfjcgysbl; 
  18.      
  19.     private String sfyjjglrytz;     
  20.      
  21.     private String dqzt; 
  22.      
  23.     private String dqjkzt; 
  24.  
  25.      
  26.     private String dqtw; 
  27.      
  28.     private String dqszdz; 
  29.      
  30.     private String dqjzdz; 
  31.      
  32.     private String tjsj; 

 b.Service层

  1.  
  2. @Transactional(rollbackFor = { Exception.class }) 
  3. public DataResult exporYqfkdj(YqfkdjBean yqfkdjBean) throws Exception { 
  4.     DataResult result = new DataResult(); 
  5.     List list = new ArrayList(); 
  6.     try { 
  7.          
  8.         result = getYqfkMhCXQuery(yqfkdjBean); 
  9.         SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmssSSS"); 
  10.         for (int i = 0; i < result.getTotalcount(); i++) { 
  11.             ExportYqfkdj dmKhfwdcDtjlZxDto = new ExportYqfkdj(); 
  12.             dmKhfwdcDtjlZxDto = ObjectUtil.parsePojo(result.getResults().get(i), ExportYqfkdj.class); 
  13.             dmKhfwdcDtjlZxDto.setXuhao(i + 1); 
  14.             list.add(dmKhfwdcDtjlZxDto); 
  15.         } 
  16.         String filepath = "D:/疫情防控信息" + df.format(new Date()) + ".xlsx"
  17.         if (System.getProperty(YqfkdjUtils.Wjdz.NAME).toLowerCase().startsWith(YqfkdjUtils.Wjdz.LI) 
  18.                 || System.getProperty(YqfkdjUtils.Wjdz.NAME).toLowerCase().startsWith(YqfkdjUtils.Wjdz.LIN)) { 
  19.             filepath = "/home/Tomcat/temp/" + df.format(new Date()) + ".xlsx"
  20.         } 
  21.         EasyExcel.write(filepath, ExportYqfkdj.class).head(head()).sheet().doWrite(list); 
  22.         result.setResults(list); 
  23.         result.setSuccess(true); 
  24.         result.setMsg(filepath); 
  25.     } catch (Exception e) { 
  26.         result.setSuccess(false); 
  27.         result.setMsg(YqfkdjUtils.Cytx.DCSB); 
  28.         e.printStackTrace(); 
  29.         throw e; 
  30.     } 
  31.     return result; 
  32. private List head() { 
  33.     List list = new ArrayList(); 
  34.     List head0 = new ArrayList(); 
  35.     head0.add("序号"); 
  36.     List head1 = new ArrayList(); 
  37.     head1.add("姓名"); 
  38.     List head2 = new ArrayList(); 
  39.     head2.add("证件号码"); 
  40.     List head3 = new ArrayList(); 
  41.     head3.add("联系电话"); 
  42.     List head4 = new ArrayList(); 
  43.     head4.add("工作所在单位"); 
  44.     List head5 = new ArrayList(); 
  45.     head5.add("是否接触疑似病例"); 
  46.     List head6 = new ArrayList(); 
  47.     head6.add("是否与隔离人员同住"); 
  48.     List head7 = new ArrayList(); 
  49.     head7.add("当前状态"); 
  50.     List head8 = new ArrayList(); 
  51.     head8.add("当前健康状态"); 
  52.     List head9 = new ArrayList(); 
  53.     head9.add("体温(°C)"); 
  54.     List head10 = new ArrayList(); 
  55.     head10.add("当前所在地址"); 
  56.     List head11 = new ArrayList(); 
  57.     head11.add("当前居住地址"); 
  58.     List head12 = new ArrayList(); 
  59.     head12.add("提交时间"); 
  60.     list.add(head0); 
  61.     list.add(head1); 
  62.     list.add(head2); 
  63.     list.add(head3); 
  64.     list.add(head4); 
  65.     list.add(head5); 
  66.     list.add(head6); 
  67.     list.add(head7); 
  68.     list.add(head8); 
  69.     list.add(head9); 
  70.     list.add(head10); 
  71.     list.add(head11); 
  72.     list.add(head12); 
  73.     return list; 

 c.Controller层

  1. @RegisterToSMP(serviceDisplay = "疫情防控查询导出"
  2. @RequestMapping(value = "/DM/yqfkdj/gr/yqfkdjdc$m=export.service", method = RequestMethod.POST) 
  3. public void exportKhfxxx(@RequestBody YqfkdjBean yqfkdjBean, HttpServletResponse resp) throws Exception { 
  4.     DataResult result = new DataResult(); 
  5.     try { 
  6.         SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmssSSS"); 
  7.         result = yqfkdjService.exporYqfkdj(yqfkdjBean); 
  8.         String filepath = result.getMsg().replace("\""""); 
  9.         File file = new File(filepath); 
  10.         String filename = "疫情防控信息" + df.format(new Date()) + ".xlsx"
  11.         InputStream fis = new BufferedInputStream(new FileInputStream(filepath)); 
  12.         byte[] buffer = new byte[fis.available()]; 
  13.         fis.read(buffer); 
  14.         fis.close(); 
  15.         resp.reset(); 
  16.         resp.setHeader("Content-Disposition"
  17.                 "attachment;filename=" + new String(filename.replaceAll(" """).getBytes("gbk"))); 
  18.         resp.setHeader("Content-Length""" + file.length()); 
  19.         OutputStream os = new BufferedOutputStream(resp.getOutputStream()); 
  20.         resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
  21.         // 输出文件 
  22.         os.write(buffer); 
  23.         os.flush(); 
  24.         os.close(); 
  25.     } catch (Exception e) { 
  26.         e.printStackTrace(); 
  27.         log.info(YqfkdjUtils.Cytx.DCSB); 
  28.         throw e; 
  29.     } 

 d.测试

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

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

本篇带给大家关于Java技术,实现pdf和Excel的生成及数据动态插入、导出,希望对你有所帮助!

Java怎么实现pdf和Excel的生成及数据动态插入与导出

这篇文章主要介绍“Java怎么实现pdf和Excel的生成及数据动态插入与导出”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java怎么实现pdf和Excel的生成及数据动态插入与导出”文章能帮助大
2023-06-27

怎么用Java Hutool工具实现验证码生成及Excel文件的导入和导出

这篇文章主要介绍“怎么用Java Hutool工具实现验证码生成及Excel文件的导入和导出”,在日常操作中,相信很多人在怎么用Java Hutool工具实现验证码生成及Excel文件的导入和导出问题上存在疑惑,小编查阅了各式资料,整理出简
2023-06-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录