JAVA --- 导入Excel, 将表格中的数据存入数据库中.

框架Spring + Mybatis + SpringMVC.

使用jar包:  poi-ooxml 3.15-beta2  注意: 不同的poi的jar包所带有的功能是不一样的.如果你的项目中使用了其他poi的jar包而导致以下代码在你的项目中提示报错,请自行甄别.


先写一个基础的上传jsp

需要用到两个 js : 

jquery-3.3.1.min.js

ajaxfileupload.js

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>



  
  上传Excel



上传Excel








以上, 就只是一个简单的上传页面 , 该页面不仅使用上传Excel, 确切的说, 任何资源的上传都可以用上这个简化版.其中一些参数自行替换成自己的即可.

注意: jsp中的input框中的name名称要和Controller层中指定方法上的参数名称相同: 

MultipartFile multipartFile    ---->      

接下来开始Controller的方法:

 @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    @ResponseBody
    public String importExcel(HttpServletRequest request, MultipartFile multipartFile) throws Exception {

        //准备List容器进行存储数据
        List> ListMap = new ArrayList>();

        //利用Workbook接口和判断excel版本创建相应版本 HSSFWorkbook/XSSFWorkbook对象
        org.apache.poi.ss.usermodel.Workbook workbook = null;

        // 获取上传文件的原始名称
        String filename = multipartFile.getOriginalFilename();

        //获取文件后缀名称,如果后缀是xls则结果为true,如果为xlsx,则结果为false.
        boolean isExcel2003 = filename.toLowerCase().endsWith("xls") ? true : false;

        //根据不同版本,创建不同的EXCEL表格. 注意: 有的poi的jar包在这一步是不适用的.如果不适用则只能根据不同文件进行不同的方法处理了.
        if (isExcel2003) {
            workbook = new org.apache.poi.hssf.usermodel.HSSFWorkbook(multipartFile.getInputStream());
        } else {
            workbook = new org.apache.poi.xssf.usermodel.XSSFWorkbook(multipartFile.getInputStream());
        }

        //创建这个EXCEL的一页. 一个工作簿有多个sheet,可以把工作簿就看成一本书, sheet就是页. 每页里面就是一张Excel表格了.
        org.apache.poi.ss.usermodel.Sheet sheet = workbook.getSheetAt(0);


        //获取EXCEL第一页中(列头)的总列数.
        int physicalNumberOfCells = sheet.getRow(0).getPhysicalNumberOfCells();


        /**
         * 通常第一行都是标题,所以从第二行开始读取数据.这要根据实际情况自行定义开始索引.
         */
        for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {

            //准备容器
            HashMap stringStringHashMap = new HashMap<>();

            //获取这个一页中这个表格的一行数据.
            org.apache.poi.ss.usermodel.Row row = sheet.getRow(i);

            //如果该行里面存在数据.
            if (row != null) {

                //遍历这行的所有列,按顺序取值,并存入一个map中,key为列的顺序,value为EXCEL这一列的具体值
                for (int j = 0; j < physicalNumberOfCells; j++) {

                    //指定每行每列的接收类型为String
                    String key = "" + j;

                    //获取每一列
                    org.apache.poi.ss.usermodel.Cell cell = row.getCell(j);

                    //准备接收列内容的容器.
                    String value = "";

                    //由于每一列的值类型都可能不同, 所以要根据不同类型进行转换, 否则取值时候会出现问题.

                    //如果列内容不为null
                    if (cell != null) {

                        //则判断是否为数值-- 数据又分两种: 日期和纯数字.
                        if (0 == cell.getCellType()) {

                            // 如果是日期类型.
                            if (org.apache.poi.hssf.usermodel.HSSFDateUtil.isCellDateFormatted(cell)) {
                                // 则以日期格式获取列值
                                Date date = cell.getDateCellValue();
                                //并指定日期格式,进行格式化
                                DateFormat formater = new SimpleDateFormat(
                                        "yyyy-MM-dd");
                                value = formater.format(date);
                            } else {

                                //如果不是日期, 则为纯数字. 我在这里直接以String类型接收, 正常来讲是要用纯数字接收的.
                                cell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING);
                                value = cell.getStringCellValue();

                            }

                        } else {

                            //如果不为数值, 既不是日期也不是纯数字, 在这里, 统统设置成以字符串进行接收. 如果想具体区别接收,请自行百度.
                            cell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING);
                            value = cell.getStringCellValue();

                        }
                    } else {

                        //如果列内容为null, 则直接设置内容为 " ";
                        value = "";

                    }

                    //存储map中
                    if (StringUtils.isEmpty(value)) {
                        value = "";
                    }

                    //将这一列, 以列序号为key, 列内容为值, 存入准备好的map容器中.
                    stringStringHashMap.put(key, value);

                }

                //最后, 将这一行作为一个整体对象存进List中.
                ListMap.add(stringStringHashMap);
            } else {
                break;
            }
        }

        //以上, 就得到了上传进来的Excel中的数据.

        /**---------------------------华丽的分割线---------------------------------*/


        //以下,则可以对该数据进行自己项目的不同操作.


        //最后,返回处理成功的标识即可.
        return "true";
    }

以上, 仅仅只是拿到了上传的Excel, 并将所有内容读取到由多个Map组成的List里面. 至于拿到表格数据后需要做什么具体操作, 直接对这个List里面的数据进行操作即可.

你可能感兴趣的:(后台管理)