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

导入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实现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;

        }

    }

深圳网站建设www.sz886.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容