当前位置: 首页 > 工具软件 > jQuery.sheet > 使用案例 >

jQuery的Ajax上传解析Excel表格

公良天逸
2023-12-01

需求描述:一个Excel文档中有三个sheet,需要根据不同的上传按钮,解析不同的sheet中的数据,组装成一个List。数据都为必填,如有空格或者null的数据直接去除。
一、首先展示HTML的代码,其中js代码为了方便直接放在了html中。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<body>
<form enctype="multipart/form-data">
            <input type="file" name="file" id="file">
            <input name="query" type="button" value="导入excel">
 </form>
</body>
<script type="text/javascript">
    $('input[name="query"]').click(function(){
        var fd = new FormData();
         fd.append("sheetNo", 2); //上传的参数名 参数值 k-v键值对
         fd.append("file", $("#file").get(0).files[0]);//上传的文件file
         $.ajax({  
              url:"/jiexi",  
              type:"post",  
              data:fd,  
              cache: false,  
              processData: false,  
              contentType: false,  
              success:function(data){ 
                  console.log(data);
                    alert("操作成功!");  
              },  
              error:function(e){  
                  alert("网络错误,请重试!!");  
               }  
              });  
    })

</script>
</html>

二、为了数据的使用方便,我们根据表头的长度和传入的sheet1、sheet2、sheet3来判断。直接放代码

    /**
     * 功能描述:解析Excel接口
     * @param file MultipartFile
     * @param sheetNo int
     * @return Object
     * @author:qhyu 
     * @date:2018年8月15日
     */
    @PostMapping(value = "/jiexi")
    public Object jiexi(MultipartFile file,int sheetNo) throws IOException {
        String fileName = file.getOriginalFilename();
        // 判断文件是.xlsx或者xls结尾。如果不是则抛出提示信息
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        if (!"xlsx".equals(suffix) && !"xls".equals(suffix)) {
            System.out.println("请传入excel文件");
        }
        return getList(suffix, file.getInputStream(),sheetNo);
    }

    /**
     * 功能描述: 获取解析excel的数据
     * @param suffix String
     * @param inputStream InputStream
     * @param sheetNo int
     * @return ArrayList<Object>
     * @author:qhyu 
     * @date:2018年8月15日
     */
    private ArrayList<Object> getList(String suffix, InputStream inputStream,int sheetNo) throws IOException {
        ArrayList<Object> arrayList = new ArrayList<Object>();
        // 具体执行导入,可以引入策略模式
        // 解决excel2003和excel2007版本的问题
        if ("xlsx".equals(suffix)) {
            xlsxImp(inputStream, arrayList,sheetNo);
        }
        if ("xls".equals(suffix)) {
            xlsImp(inputStream, arrayList,sheetNo);
        }
        // 万一新增一种新格式,对修改打开了,不符合oo编程规范
        return arrayList;
    }

    /**
     * 功能描述:2003xls导入查询
     * @param inputStream InputStream
     * @param arrayList   ArrayList<Object>
     * @author:qhyu 
     * @date:2018年8月15日
     */
    private void xlsImp(InputStream inputStream, ArrayList<Object> arrayList, int index) throws IOException {
        // 初始整个Excel
        HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
        // 获取第一个sheet表
        HSSFSheet sheet = workbook.getSheetAt(0);
        for (int rowIndex = 2; rowIndex < sheet.getLastRowNum(); rowIndex++) {
            HashMap<String, Object> hashMap = new HashMap<String, Object>();
            HSSFRow row = sheet.getRow(rowIndex);
            //整行都为空去掉
            if(row==null) {
                continue;
            }
            for (int cellIndex = 0; cellIndex < row.getLastCellNum(); cellIndex++) {
                HSSFCell cell = row.getCell(cellIndex);
                // 避免空指针异常
                if (cell == null) {
                    hashMap.put(getKey(inputStream, index, cellIndex), " ");
                    continue;
                }
                // 判断格式
                if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                    SimpleDateFormat sFormat = new SimpleDateFormat("yyyy-MM-dd");
                    Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                    hashMap.put(getKey(inputStream, index, cellIndex), sFormat.format(date));
                } else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                    hashMap.put(getKey(inputStream, index, cellIndex), cell.getStringCellValue());
                } else if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
                    hashMap.put(getKey(inputStream, index, cellIndex), cell.getCellFormula().toString());
                } else if (cell.getCellType() == HSSFCell.CELL_TYPE_BLANK
                        || cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN
                        || cell.getCellType() == HSSFCell.CELL_TYPE_ERROR) {
                    hashMap.put(getKey(inputStream, index, cellIndex), " ");
                }
            }
            if (hashMap.containsValue(" ") || hashMap.containsValue(null)
                    || hashMap.size() < sheet.getRow(0).getLastCellNum()) {
                continue;
            } else {
                arrayList.add(hashMap);
            }
        }
    }

    /**
     * 功能描述:2007xlsx导入查询
     * @param inputStream InputStream
     * @param arrayList   ArrayList<Object>
     * @author:qhyu @date:2018年8月15日
     */
    private void xlsxImp(InputStream inputStream, ArrayList<Object> arrayList,int index) throws IOException {
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
        XSSFSheet sheet = xssfWorkbook.getSheetAt(index);
        for (int rowIndex = 2; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
            HashMap<String, Object> hashMap = new HashMap<String, Object>();
            XSSFRow row = sheet.getRow(rowIndex);
            //整行都为空去掉
            if(row==null) {
                continue;
            }
            for (int cellIndex = 0; cellIndex < row.getLastCellNum(); cellIndex++) {
                XSSFCell cell = row.getCell(cellIndex);
                // 避免空指针异常
                if (cell == null) {
                    hashMap.put(getKey(inputStream, index, cellIndex), " ");
                    continue;
                }
                // 判断是否是日期格式
                if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
                    SimpleDateFormat sFormat = new SimpleDateFormat("yyyy-MM-dd");
                    Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                    hashMap.put(getKey(inputStream, index, cellIndex), sFormat.format(date));
                } else if (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
                    hashMap.put(getKey(inputStream, index, cellIndex), cell.getStringCellValue());
                } else if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
                    hashMap.put(getKey(inputStream, index, cellIndex), cell.getCellFormula().toString());
                } else if (cell.getCellType() == XSSFCell.CELL_TYPE_BLANK
                        || cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN
                        || cell.getCellType() == XSSFCell.CELL_TYPE_ERROR) {
                    hashMap.put(getKey(inputStream, index, cellIndex), " ");
                }
            }
            if (hashMap.containsValue(" ") || hashMap.containsValue(null)
                    || hashMap.size() < sheet.getRow(0).getLastCellNum()) {
                continue;
            } else {
                arrayList.add(hashMap);
            }

        }
    }

    /**
     * 功能描述:根据表头获取key值
     * @param inputStream InputStream
     * @return String
     * @author:qhyu 
     * @date:2018年8月16日
     */
    public static String getKey(InputStream inputStream, int index, int cell) {
        String result = null;
        // sheet1(客票核验身份证查询)
        if (index == 0) {
            switch (cell) {
            case 0:
                result="CardID";
                break;
            case 1:
                result="FlightNo";
                break;
            case 2:
                result="Segment";
                break;
            case 3:
                result="Time";
                break;
            default:
                break;
            }
        }
        // sheet2(客票核验票号查询)
        if (index == 1) {
            switch (cell) {
            case 0:
                result="TicketNo";
                break;
            case 1:
                result="FlightNo";
                break;
            case 2:
                result="Segment";
                break;
            case 3:
                result="Time";
                break;
            default:
                break;
            }
        }
        // sheet3(客票追踪)
        if (index == 2) {
            switch (cell) {
            case 0:
                result="TicketNo";
                break;
            default:
                break;
            }
        }
        return result;
    }

controller中的方法区分了2003和2007版本,也就是xls和xlsx的区别,测试的时候需要另存为改后缀名,直接修改后缀是不行的。大部分是贴代码,自己测试过没有发现问题。

 类似资料: