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

沙海 2021年7月30日04:07:17Java评论110字数 10425阅读34分45秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/39602.html

需求一、给了一个表单,让把查出来的数据组装到表单中并且提供以PDF格式的下载功能。需求二、将数据查出来以Excel表格的形式下载下来。你代码中实体类中对应的数据(注意字段一定要一一对应),配置完毕就可以保存进行下面的代码编写工作了。欢迎加入我的知识星球,一起探讨架构,交流源码。文章源自JAVA秀-https://www.javaxiu.com/39602.html

原文约 6053 | 图片 14 | 建议阅读 13 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/39602.html

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

点击关注 ? Java基基 文章源自JAVA秀-https://www.javaxiu.com/39602.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/39602.html

#Java基基文章源自JAVA秀-https://www.javaxiu.com/39602.html

269个文章源自JAVA秀-https://www.javaxiu.com/39602.html

点击上方“Java基基”,选择“设为星标”文章源自JAVA秀-https://www.javaxiu.com/39602.html

做积极的人,而不是积极废人!文章源自JAVA秀-https://www.javaxiu.com/39602.html

文章源自JAVA秀-https://www.javaxiu.com/39602.html

源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/39602.html

 文章源自JAVA秀-https://www.javaxiu.com/39602.html

文章源自JAVA秀-https://www.javaxiu.com/39602.html

来源:cnblogs.com/Tom-shushu/p/14279357.html文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

一、序言

Excel、PDF的导出、导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策。文章源自JAVA秀-https://www.javaxiu.com/39602.html

公司有这么两个需求:文章源自JAVA秀-https://www.javaxiu.com/39602.html

需求一、给了一个表单,让把查出来的数据组装到表单中并且提供以PDF格式的下载功能。文章源自JAVA秀-https://www.javaxiu.com/39602.html

需求二、将数据查出来以Excel表格的形式下载下来。文章源自JAVA秀-https://www.javaxiu.com/39602.html

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

1、第一步:PDF制作模板

因为PDF常用的软件不让支持编辑,我们就先使用WPS以Word的形式进行编辑制作出与客户需求一样的样式,然后直接另存为 .pdf 的形式如下图所示:文章源自JAVA秀-https://www.javaxiu.com/39602.html

a.Word里面制作模板文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

b.更改名字为 .pdf形式文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

c.这时需要用到一个叫:Adobe Acrobat DC的软件(可以白嫖7天^_^),具体操作如下:文章源自JAVA秀-https://www.javaxiu.com/39602.html

用Adobe Acrobat DC打开我们刚才改过名字的PDF文件,点击右下角的“更多工具”按钮文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

到下面这个页面再点击“准备表单”按钮文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

d.接下来就需要详细的配置你的数据源了文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

数据源即:你代码中实体类中对应的数据(注意字段一定要一一对应),配置完毕就可以保存进行下面的代码编写工作了。文章源自JAVA秀-https://www.javaxiu.com/39602.html

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 根据表单生成一个新的pdf                ps = 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实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

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

这个比较简单,直接上代码(假定你的实体类、查询什么的都已经写好)注意:实体类一个是你自己的数据实体类还有一个是你导出时表格中对应的实体类文章源自JAVA秀-https://www.javaxiu.com/39602.html

我们以一个真实的公司业务来举个例子(一个统计疫情登记人员信息的Excel导出功能)文章源自JAVA秀-https://www.javaxiu.com/39602.html

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

import lombok.Data;/** * description: * @author: zhouhong * @version: V1.0.0 * @date: 2021年1月14日 下午3:05:54 */@Datapublic 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.测试

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

已经全部完成PDF和Excel的生成、插入、导出功能。文章源自JAVA秀-https://www.javaxiu.com/39602.html

- END -文章源自JAVA秀-https://www.javaxiu.com/39602.html

文章源自JAVA秀-https://www.javaxiu.com/39602.html

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

JAVA实现PDF和EXCEL生成和数据动态插入以及导出文章源自JAVA秀-https://www.javaxiu.com/39602.html

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/39602.html

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/39602.html

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/39602.html

文章源自JAVA秀-https://www.javaxiu.com/39602.html

文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
文章源自JAVA秀-https://www.javaxiu.com/39602.html

阅读原文文章源自JAVA秀-https://www.javaxiu.com/39602.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定