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" %>
<!DOCTYPE HTML>
<html>
<head>
  <meta charset="UTF-8" />
  <title>上传Excel</title>
</head>
<body>

<a href="#" οnclick="uploadExcel()">上传Excel</a>
<input type="file" id="excel" name="multipartFile" style="display:none;" οnchange="ajaxFileUpload()"/>

</body>

<script type="text/javascript" src="/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/js/ajaxfileupload.js"></script>

<script>

    //点击 a 标签, 触发 input 框, 选择要上传的文件
    function uploadExcel(){
        document.getElementById("excel").click();
    }

    //注意 input 中的 onchange -- 表名到选中文件之后,会触发方法ajaxFileUpload().
    function ajaxFileUpload() {
        // 进行ajax 上传.
        $.ajaxFileUpload({
            url : '/admin/test/importExcel.do',//url.
            secureuri : false,//是否启用安全提交,默认为false。
            fileElementId : 'excel',//需要上传的文件域的ID,即<input type="file">的ID。
            dataType : 'String',//服务器返回的数据类型(有json和String)
            data : {/*filetype : "images"*/},// 自定义参数
            type: 'post',//当要提交自定义参数时,这个参数要设置成post
            success : function(data, status) {
                alert("上传成功"+data);
            },
            error : function(data, status, e) {
                alert("上传失败");
            }
        })
        return false;
    }
</script>
</html>

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

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

MultipartFile multipartFile    ---->      <input type="file" id="excel" name="multipartFile"...

接下来开始Controller的方法:

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

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

        //利用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<String, Object> 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里面的数据进行操作即可.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值