当前位置: 代码网 > it编程>编程语言>Java > Java如何使用multipartFile对象解析Execl

Java如何使用multipartFile对象解析Execl

2025年02月13日 Java 我要评论
java使用multipartfile对象解析execl1.需要使用 multipartfile 包package org.springframework.web.multipart;2.数据校验pu

java使用multipartfile对象解析execl

1.需要使用 multipartfile 包

package org.springframework.web.multipart;

2.数据校验

public string exportvehicleviol(multipartfile multipartfile) {
        try {
            //对前端传递的文件进行校验
            if (multipartfile == null && multipartfile.getsize() == 0) {
                return "文件上传错误,重新上传";
            }
            //获取文件名称 判断文件是否为 execl
            string filename = multipartfile.getoriginalfilename();
            if (!(filename.endswith(".xls") || filename.endswith(".xlsx"))) {
                return "文件上传格式有误,请重新上传";
            }
            list<ehicleviolation> ehicleviolations = null;
            inputstream inputstream = multipartfile.getinputstream();
            //根据文件格式 对应不同的api解析
            if (filename.endswith(".xlsx")) {
                ehicleviolations = readxlsx(inputstream);
            } else {
                ehicleviolations = readxls(inputstream);
            }
            //数据保存
            savebatch(ehicleviolations);
        } catch (ioexception e) {
            e.printstacktrace();
        }
        return jsonresult.success("导入成功");
    }
  • multipartfile:这个类是spring提供的,用于处理文件上传。它代表了上传的文件。
  • 空文件检查:首先检查multipartfile是否为null,以及文件的大小是否为0。如果是,返回错误提示。
  • 文件类型校验:使用getoriginalfilename()获取上传文件的名称,然后检查其后缀是否为.xls.xlsx。如果不符合条件,返回格式错误的提示。
  • 输入流获取:调用multipartfile.getinputstream()获取文件的输入流,准备进行后续解析。
  • 文件解析:根据文件后缀名调用不同的解析方法:
    • 如果是.xlsx,调用readxlsx()方法。
    • 如果是.xls,调用readxls()方法。
  • 数据保存:解析完毕后,调用savebatch()将解析的数据存储到数据库。
  • 异常处理:捕获ioexception,并打印堆栈信息。可以考虑在这里加上日志记录或用户友好的错误信息。

3.主要解析的业务逻辑

①解析xls

//解析xls
    private list<ehicleviolation> readxls(inputstream inputstream) throws ioexception {
        hssfworkbook sheets = new hssfworkbook(inputstream);

        //读取第一张sheet
        hssfsheet sheetat = sheets.getsheetat(0);
        list<ehicleviolation> ehicleviolatsion = new arraylist<>();
        //rownum = 3 从第三行开始获取值
        for (int rownum = 3; rownum < sheetat.getlastrownum(); rownum++) {
            ehicleviolation ehicleviolation = new ehicleviolation();
            hssfrow row = sheetat.getrow(rownum);

            if (row != null) {
                //使用了getstringcellvalue()方法来获取值,poi会判断单元格的类型,如果非字符串类型就会抛出上面的异常。
                //所以先使用setcelltype()方法先将该单元格的类型设置为string
                //然后poi会根据字符串读取它
                row.getcell(0).setcelltype(celltype.string);
                row.getcell(1).setcelltype(celltype.string);
                row.getcell(2).setcelltype(celltype.string);
                row.getcell(3).setcelltype(celltype.string);
                row.getcell(4).setcelltype(celltype.string);
                row.getcell(5).setcelltype(celltype.string);
                row.getcell(6).setcelltype(celltype.string);
                row.getcell(7).setcelltype(celltype.string);
                row.getcell(8).setcelltype(celltype.string);
                
                string stringcellvalue0 = row.getcell(0).getstringcellvalue();
               
                string stringcellvalue1 = row.getcell(1).getstringcellvalue();
                if (stringutils.isnotblank(stringcellvalue1)) {
                    ehicleviolation.setuserdept(stringcellvalue1);
                }
                //根据自己需要 获取表格中的数据
                string stringcellvalue2 = row.getcell(2).getstringcellvalue();
                if (stringutils.isnotblank(stringcellvalue2)) {
                    ehicleviolation.setvehiclenumber(stringcellvalue2);
                } else {
                    continue;
                }
                
            }
            eehicleviolations.add(eehicleviolation);
        }
        return eehicleviolations;
    }
  • hssfworkbook:用于解析.xls格式的excel文件。通过传入inputstream创建工作簿对象。
  • 获取工作表:使用getsheetat(0)方法获取第一个工作表。
  • 创建列表:初始化一个arraylist<ehicleviolation>用于存放解析后的数据。
  • 读取行数据:使用for循环从第三行开始读取数据(假设前两行是标题或无关信息),直到最后一行:
    • 获取行对象:通过sheetat.getrow(rownum)获取当前行。
    • 行非空检查:确认行对象不为空。
    • 设置单元格类型:循环设置每个单元格的类型为字符串,以避免因数据类型不同而引发的异常(例如:尝试读取数值单元格为字符串)。
  • 获取单元格值
    • 读取第2列(索引1)的值并调用setuserdept方法设置部门信息。
    • 读取第3列(索引2)的值并调用setvehiclenumber方法设置车辆编号。如果车辆编号为空,则跳过当前行,继续处理下一行。
  • 数据存储:将解析的ehicleviolation对象添加到ehicleviolations列表中。
  • 返回数据:最后返回包含所有解析数据的列表。

②解析xlsx

//解析xlsx
    private list<vmsvehicleviolation> readxlsx(inputstream inputstream) throws ioexception {
        xssfworkbook sheets1 = new xssfworkbook(inputstream);

        xssfsheet sheetat1 = sheets1.getsheetat(0);

        list<ehicleviolation> ehicleviolatsion = new arraylist<>();
        //rownum = 3 从第三行开始获取值
        for (int rownum = 3; rownum < sheetat.getlastrownum(); rownum++) {
            ehicleviolation ehicleviolation = new ehicleviolation();
            hssfrow row = sheetat.getrow(rownum);

            if (row != null) {
                //使用了getstringcellvalue()方法来获取值,poi会判断单元格的类型,如果非字符串类型就会抛出上面的异常。
                //所以先使用setcelltype()方法先将该单元格的类型设置为string
                //然后poi会根据字符串读取它
                row.getcell(0).setcelltype(celltype.string);
                row.getcell(1).setcelltype(celltype.string);
                row.getcell(2).setcelltype(celltype.string);
                row.getcell(3).setcelltype(celltype.string);
                row.getcell(4).setcelltype(celltype.string);
                row.getcell(5).setcelltype(celltype.string);
                row.getcell(6).setcelltype(celltype.string);
                row.getcell(7).setcelltype(celltype.string);
                row.getcell(8).setcelltype(celltype.string);
                
                string stringcellvalue0 = row.getcell(0).getstringcellvalue();
               
                string stringcellvalue1 = row.getcell(1).getstringcellvalue();
                if (stringutils.isnotblank(stringcellvalue1)) {
                    ehicleviolation.setuserdept(stringcellvalue1);
                }
                //根据自己需要 获取表格中的数据
                string stringcellvalue2 = row.getcell(2).getstringcellvalue();
                if (stringutils.isnotblank(stringcellvalue2)) {
                    ehicleviolation.setvehiclenumber(stringcellvalue2);
                } else {
                    continue;
                }
                
            }
            eehicleviolations.add(eehicleviolation);
        }
        return eehicleviolations;
    }
  • xssfworkbook:用于解析.xlsx格式的excel文件。与hssfworkbook类似,只是处理的新格式。
  • 获取工作表:同样使用getsheetat(0)获取第一个工作表。
  • 列表初始化:创建一个新的arraylist<ehicleviolation>用于存放解析的数据。
  • 读取行数据:与readxls方法相同的逻辑,循环遍历从第三行开始到最后一行的所有行,读取数据。
  • 设置单元格类型和获取值:使用相同的方式设置单元格类型并读取所需的列。
  • 数据存储:添加解析后的对象到列表并返回。

注意:对于不同的execl java提供了不同的解析对象

  • xls使用hssfworkbook 对象进行解析
  • xlsx使用xssworkbook 对象进行解析

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com