关于Excel文件导入数据的详解

关于Excel文件导入详解

b端产品的价值是提高企业的效率,目的是利用系统功能去解放人。虽然批量导入在b端产品功能中是一个很小的功能点,但是提高效率在这个功能上却始终是基本准绳。从模板下载、上传操作、查看与修改等功能的设计,都需要思考如何提高使用人员的工作效率,这篇文章就以最简洁的方式,只需复制粘贴,即可完成Excle文件的导入。

前台导入按钮
<button type="button" class="layui-btn" id="upload">
<i class="layui-icon">&#xe681;</i>员工导入</button>

前台JS

<script>
    layui.use('upload', function(){
        var $ = layui.jquery
            ,upload = layui.upload;
        //指定允许上传的文件类型
        upload.render({
            elem: '#upload'
            ,url: '/upload/uploadExcel' //改成您自己的上传接口
            ,accept: 'file' //普通文件
            ,done: function(res){
                layer.msg('上传成功');
                console.log(res);
            }
        });
    });
</script>

后台类中需要导的包(直接复制进去,让他自动导不一定能导对)

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.text.ParseException;

后台方法(最后的返回结果根据你具体使用的方法返回,不修改的话即使出错也会显示上传成功)

/**
     * 解析上传人员名单excel
     *
     * @param file
     * @return
     * @throws IOException
     */
    @RequestMapping("/uploadExcel")
    @ResponseBody
    public Object uploadExcel(MultipartFile file) throws IOException, ParseException {
        //获得文件名
        String fileName = file.getOriginalFilename();
        //判断文件是否是excel文件
        if (!fileName.endsWith("xls") && !fileName.endsWith("xlsx")) {
            logger.error(fileName + "不是excel文件");
            return false;
        }
        //获得Workbook工作薄对象
        String fileName1 = file.getOriginalFilename();
        //创建Workbook工作薄对象,表示整个excel
        Workbook workbook = null;
        try {
            //获取excel文件的io流
            InputStream is = file.getInputStream();
            //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
            if (fileName1.endsWith("xls")) {
                //2003
                workbook = new HSSFWorkbook(is);
            } else if (fileName1.endsWith("xlsx")) {
                //2007 及2007以上
                workbook = new XSSFWorkbook(is);
            }
        } catch (IOException e) {
            logger.error(e.getMessage());
        }
        StringBuffer stringBuffer = new StringBuffer();
        if (workbook != null) {
            for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
                //获得当前sheet工作表
                Sheet sheet = workbook.getSheetAt(sheetNum);
                if (sheet == null) {
                    continue;
                }
                //获得当前sheet的开始行
                int firstRowNum = sheet.getFirstRowNum();
                //获得当前sheet的结束行
                int lastRowNum = sheet.getLastRowNum();
                //循环除了第一行的所有行
                for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) {
                    //获得当前行
                    Row row = sheet.getRow(rowNum);
                    if (row == null) {
                        continue;
                    }
                    //获得当前行的开始列
                    int firstCellNum = row.getFirstCellNum();
                    //获得当前行的列数
                    int lastCellNum = row.getLastCellNum();
                    //循环当前行
                    for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
                        Cell cell = row.getCell(cellNum);
                        if (cell != null) {
                            stringBuffer.append(cell.toString().toString());
                            switch (cellNum) {
                                //第rowNum行的第一列
                                case 0:
                                    cell.toString();
                                    break;
                                //第rowNum行的第一列
                                case 1:
                                    cell.toString();
                                    break;
                                //第rowNum行的第一列
                                case 2:
                                    cell.toString();
                                    break;
                            }
                        }
                    }
                }
            }
        }
        //需要根据实际的返回结果return
        return true;
    }

这个后台可以精确的获取到第X行第X列的数据,当我们可以获取到每个格子的数据时,我们也就可以对这些数据进行所需要的操作。

猜你喜欢

转载自blog.csdn.net/qq_45593609/article/details/108465113