servlet实现excel的导入导出

唠嗑部分

用户投稿篇

image-20230504135850500

本文会以案例代码的形式实现excel的导入导出,代码注释十分详细,请需要的小伙伴务必详细阅读

注意点:

1、本案例重点关注于如何使用jsp+servlet实现excel的导入导出,前端页面小白随便画的(意思是比较丑),没有专业的美工,主要是没必要画好看,哈哈哈

2、案例SQL均会在源代码中包含,请关注源代码->db目录

言归正传

数据库比较简单,初始化后创建两条数据

image-20230504140511634

我们来说说本期实现的功能:

1、请求http://localhost:8080/user/getList进入用户列表首页,首页包含导入、导出按钮

2、点击导出,将全部用户数据导出至userlist.xls文件中

3、修改userlist.xls文件中的数据,将该文件中的用户数据导入至数据库

4、查看数据库,包含初始化数据+导出的数据即可

实现主要过程:

1、核心依赖

<!--excel相关依赖-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

2、封装Dao,使用jdbc封装两个方法,分别是查询所有数据,批量插入

对于jdbc的操作就不多说了,可参考文章:

3、创建Excel导出的Servlet,部分代码

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        List<User> userList = userDao.selectAll();
        //创建HSSFWorkbook对象(excel的文档对象)
        HSSFWorkbook wb = new HSSFWorkbook();
        //建立新的sheet对象(excel的表单)
        HSSFSheet sheet = wb.createSheet("用户数据表");
        //在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
        HSSFRow row1 = sheet.createRow(0);
        //创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
        HSSFCell cell = row1.createCell(0);
        //设置单元格内容
        cell.setCellValue("用户数据一览表");
        //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4));
        //在sheet里创建第二行
        HSSFRow row2 = sheet.createRow(1);
        //创建单元格并设置单元格内容
        row2.createCell(0).setCellValue("用户编号");
        row2.createCell(1).setCellValue("用户名");
        row2.createCell(2).setCellValue("用户密码");
        row2.createCell(3).setCellValue("用户年龄");
        row2.createCell(4).setCellValue("创建时间");

        int rowNum = 1;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (User user : userList) {
            //循环在sheet创建行
            HSSFRow rown = sheet.createRow(++rowNum);
            rown.createCell(0).setCellValue(user.getId());
            rown.createCell(1).setCellValue(user.getUsername());
            rown.createCell(2).setCellValue(user.getPassword());
            rown.createCell(3).setCellValue(user.getAge());
            rown.createCell(4).setCellValue(format.format(user.getCreatetime()));
        }
        //输出Excel文件
        OutputStream output = resp.getOutputStream();
        // 设置附件响应头,浏览器会进行下载
        resp.setHeader("Content-disposition", "attachment; filename=userlist.xls");
        //响应正文的MIME类型,表示Excel
        resp.setContentType("application/vnd.ms-excel");
        wb.write(output);
        output.close();
    }

下图为代码与excel的对应关系,请知悉

image-20230504142002785

4、创建Excel导入的Servlet,部分代码

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置编码字符集
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        Part file = req.getPart("file");
        // 获取源文件名
        String fileName = file.getSubmittedFileName();
        InputStream is = file.getInputStream();
        Workbook hssfWorkbook = null;
        // 判断后缀名,分别处理
        if (fileName.endsWith("xlsx")) {
            hssfWorkbook = new XSSFWorkbook(is); //Excel 2007
        } else if (fileName.endsWith("xls")) {
            hssfWorkbook = new HSSFWorkbook(is); //Excel 2003
        } else {
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().write("文件类型暂不支持");
        }
        List<User> list = new ArrayList<User>();
        // 循环工作表Sheet
        for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
            Sheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
            if (hssfSheet == null) {
                continue;
            }
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            // 循环行Row,注意从第二行开始,第0行是标题,1行是表头
            for (int rowNum = 2; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                Row hssfRow = hssfSheet.getRow(rowNum);
                if (hssfRow != null) {
                    User user = new User();
                    Cell name = hssfRow.getCell(1);
                    Cell pwd = hssfRow.getCell(2);
                    Cell age = hssfRow.getCell(3);
                    Cell createStr = hssfRow.getCell(4);
                    user.setUsername(name.toString());
                    user.setPassword(pwd.toString());
                    Double d = new Double(age.getNumericCellValue());
                    user.setAge(d.intValue());
                    try {
                        user.setCreatetime(format.parse(createStr.toString()));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    list.add(user);
                }
            }
            int i = userDao.insertBatch(list);
            System.out.println(i);
            req.getRequestDispatcher("/user/getList").forward(req, resp);
        }
    }

注意两个for循环是在循环什么哈,别混淆了

image-20230504143441364

5、功能测试

image-20230504143924977

结语

1、功能实现了,完结撒花。

2、对于SpringBoot而言,并没有这么复杂,约定大于配置,已经帮我们做好了,有兴趣的小伙伴可以自行研究下。

3、源码及笔记获取方式还是老规矩,群文件自取。

4、制作不易,一键四连再走吧,您的支持永远是我最大的动力!

5、Java全栈技术交流群:941095490,欢迎你的加入!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈小白.

感谢老板,祝老板今年发大财!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值