当前位置: 首页 > 后端技术 > Java

接到一个变态需求:如何用Java生成Excel+PDF导出?

时间:2023-04-01 16:07:23 Java

作者:慢时光\来源:cnblogs.com/Tom-shushu/p/14279357.html一、前言Excel和PDF的导出导入是我们在工作中经常遇到的问题。正好今天公司的业务碰到了。对于这个问题,顺便记下,以防下次遇到同样的问题而束手无策。公司有两个需求:需求1.给一个表格,将检测到的数据组装成表格,并提供PDF格式的下载功能。要求2.数据核对并以Excel格式下载。二、Java实现PDF生成和数据动态插入导出功能1、第一步:PDF制作模板因为PDF常用的软件不允许编辑,所以我们先用WPS以Word的形式编辑,制作出来的一样客户需要的样式,然后直接另存为.pdf形式如下图:在Word中制作模板b.将名称更改为.pdf表格c。这时候就需要用到一个软件叫:AdobeAcrobatDC,具体操作如下:用AdobeAcrobatDC打开我们刚刚重命名的PDF文件,点击右下角的“更多工具”按钮即可到以下页面,然后单击“准备表格”按钮d.接下来,您需要详细配置您的数据源。数据源即:你代码中实体类中对应的数据(注意字段一定要一一对应),配置好后保存即可开始下面的代码编写工作。2、代码的写法假设我们的实体类已经写好了,通过前端传入和获取数据,模板位置在E盘根目录。名称为:VehicleMaintenanceApprovalForm.pdf导入jar包:com.itextpdfitextpdf5.5.13实现PDF生成、数据插入、导出@RegisterToSMP(serviceDisplay="预览页面PDF下载")@RequestMapping(value="/DM/gwclwxsq/qygl/exportPDF$m=query.service",method=RequestMethod.POST)publicStringexportPdf(@RequestBodyGwclwxsqBeangwclwxsqBean,HttpServletResponseresponse)throwsUnsupportedEncodingException{//1.指定解析器System.setProperty("javax.xml.parsers.DocumentBuilderFactory.org","com.sun.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");Stringfilename="车辆维修审批表.pdf";字符串路径="e:/";response.setContentType("应用程序/pdf");response.setHeader("Content-Disposition","attachment;fileName="+URLEncoder.encode(文件名,"UTF-8"));OutputStreamos=null;PdfStamperps=null;PdfReader阅读器=null;尝试{os=response.getOutputStream();//2读入pdf格式reader=newPdfReader(path+"/"+filename);//3根据形式生成新的pdfps=newPdfStamper(reader,os);//4获取pdf表单AcroFieldsform=ps.getAcroFields();//5给表格添加中文字体这里使用系统字体如果不设置,可能不会显示中文BaseFontbf=BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",BaseFont.IDENTITY_H,BaseFont.EMBEDDED);form.addSubstitutionFont(bf);//6查询数据==================================================Mapdata=newHashMap();data.put("commitTime",gwclwxsqBean.getCommitTime());data.put("驱动",gwclwxsqBean.getDriver());data.put("carId",gwclwxsqBean.getCarId());data.put("carType",gwclwxsqBean.getCarType());data.put("repairAddress",gwclwxsqBean.getRepairAddress());data.put("repairCost",gwclwxsqBean.getRepairCost());data.put("项目",gwclwxsqBean.getProject());data.put("fwbzzxfzrYj",gwclwxsqBean.getFwbzzxfzrYj());data.put("fgldspYj",gwclwxsqBean.get()FgldspY);data.put("备注",gwclwxsqBean.getRemarks());//7遍历数据并赋值给pdf表单formfor(Stringkey:data.keySet()){form.setField(key,data.get(key).toString());}ps.setFormFlattening(真);log.info("********************PDF导出成功***********************");}catch(Exceptione){         log.error("******************PDF导出失败**************************”);e.printStackTrace();}最后{尝试{ps.close();读者.close();操作系统关闭();}catch(Exceptione){e.printStackTrace();}}returnnull;}3、测试3、Java实现Excel生成、数据插入、导出。写得好)注:其中一个实体类是自己的数据实体类,另一个是导出时表中对应的实体类100道Java中高级面试题总结下面以一个真实的公司业务为例(统计疫情登记信息的Excel导出功能)a.表头对应实体类ExportYqfkdj.javaimportlombok.Data;/***description:*@author:zhouhong*@version:V1.0.0*@date:2021年1月14日下午3:05:54*/@DatapublicclassExportYqfkdj{/***序列号*/privateIntegerxuhao;/***姓名*/privateStringxingming;/***证书编号*/privateStringzjhm;/***联系电??话*/privateStringlxdh;/***申请人工作单位*/privateStringsqrGzdw;/***是否接触过疑似病例*/privateStringsfjcgysbl;/***您目前是否与居家隔离的人同住*/privateStringsfyjjglrytz;/***当前状态*/privateStringdqzt;/***当前健康状态*/privateStringdqjkzt;/***当前体温*/privateStringdqtw;/***当前地址*/privateStringdqszdz;/***当前住址*/privateStringdqjzdz;/***提交时间**/privateStringtjsj;}b.服务层/***export*@paramyqfkdjBean*@authorzhouhong*@return*@throwsException*/@Transactional(rollbackFor={Exception.class})publicDataResultexporYqfkdj(YqfkdjBeanyqfkdjBean)throwsException{DataResultresult=newDataResult();}Listlist=newArrayList();try{/*查询导出信息*/result=getYqfkMhCXQuery(yqfkdjBean);SimpleDateFormatdf=newSimpleDateFormat("yyyyMMddhhmmssSSS");对于(inti=0;i>*/privateList>head(){List>list=newArrayList>();Listhead0=newArrayList();head0.add("序号");Listhead1=newArrayList();head1.add("姓氏");Listhead2=newArrayList();head2.add("证书号码");Listhead3=newArrayList();head3.add("联系电话");Listhead4=newArrayList();head4.add("工作单位");Listhead5=newArrayList();head5.add("你是否接触过疑似病例");Listhead6=newArrayList();head6.add("是否与被隔离人员有接触同居");Listhead7=newArrayList();head7.add("当前状态");Listhead8=newArrayList();head8.add("当前健康状态");Listhead9=newArrayList();head9.add("体温(°C)");Listhead10=newArrayList();head10.add("当前地址");Listhead11=newArrayList();head11.add("当前地址");Listhead12=newArrayList();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);returnlist;}c.Controller层@RegisterToSMP(serviceDisplay="疫情防控查询导出")@RequestMapping(value="/DM/yqfkdj/gr/yqfkdjdc$m=export.service",method=RequestMethod.POST)publicvoidexportKhfxxx(@RequestBodyYqfkdjBeanyqfkdjBean,HttpServletResponseresp)throwsException{DataResultresult=newDataResult();尝试{SimpleDateFormatdf=newSimpleDateFormat("yyyyMMddhhmmssSSS");结果=yqfkdjService.exporYqfkdj(yqfkdjBean);Stringfilepath=result.getMsg().replace("\"","");Filefile=newFile(filepath);Stringfilename="疫情防控信息"+df.format(newDate())+".xlsx";InputStreamfis=newBufferedInputStream(newFileInputStream(filepath));byte[]buffer=newbyte[fis.available()];fis.read(buffer);fis.close();resp.reset();resp.setHeader("Content-Disposition","attachment;filename="+newString(filename.replaceAll("","").getBytes("gbk")));resp.setHeader("Content-Length",""+file.length());OutputStreamos=newBufferedOutputStream(resp.getOutputStream());resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");//输出文件os.write(buffer);os.flush();操作系统关闭();}catch(Exceptione){e.printStackTrace();log.info(YqfkdjUtils.Cytx.DCSB);扔e;}}测试已经完成。PDF、Excel的生成、插入、导出功能。参考链接:https://www.cnblogs.com/wangp...近期热点文章推荐:1.1000+Java面试题及答案(2021最新版)2.别再满脑子if/else了,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.6正式发布,一大波新特性。.5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!