SpringBoot项目中关于Excel的解析(一)

    最近在做SpringBoot项目,项目中需要上传Excel文件,对Excel文件中的内容进行解析,然后将需要的数据存入数据库,同时还要根据用户的需求,将需要的内容生成Excel文件,并下载下来。本篇主要是介绍Excel文件的上传,然后对文件进行解析处理的过程。使用的开发工具是IDEA  

内容概要:

  • 项目maven依赖
  • Controller层代码
  • 工具类HandleFile代码
  • 静态页面和测试文件
  • 测试的结果

  一、项目maven依赖

        需要注意的是:这里选择的poi-ooxml和poi的依赖版本最好一致,否则可能会有两个依赖会出现不匹配的问题。本人曾遇到过poi-ooxml的版本是3.9,poi的版本是3.13,最终在测试阶段报错:

      java.lang.IllegalAccessError: tried to access method org.apache.poi.util.POILogger.log(ILjava/lang/Object;)V from class org.apache.poi.openxml4j.opc.PackageRelationshipCollection

        
            org.apache.poi
            poi-ooxml
            3.9
        
        
            org.apache.poi
            poi
            3.9
        

二、Controller层

@RestController
@RequestMapping("/handleFile/")
@Slf4j
public class HandleFileController{

     /**
     * 上传Excel文件
     * @param request
     * @return
     * @throws Exception
     */
    @PostMapping(value = "excel/upload")
    @ResponseBody
    public String uploadExcel(HttpServletRequest request) throws Exception {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

        MultipartFile file = multipartRequest.getFile("filename");
        if (file.isEmpty()) {
            return "文件不能为空";
        }
        InputStream inputStream = file.getInputStream();
        List> list = HandleFile.parseExcel(inputStream,file.getOriginalFilename());
        inputStream.close();

        for (int i = 0; i < list.size(); i++) {
            List lo = list.get(i);
            //TODO 随意发挥
            //可以将数据遍历出来后,存储到数据库中
            System.out.println(lo);

        }
        return "上传成功";
    }

} 
  

   三、HandleFile工具类

public class HandleFile{


    /**
     * 解析Excel文件
     *
     * @param in
     * @param fileName
     */
    public static List> parseExcel(InputStream in, String fileName) throws Exception {
        List list = null;
        Workbook work = null;
        list = new ArrayList<>();
        //创建Excel工作薄
        work = getWorkbook(in, fileName);
        if (null == work) {
            throw new Exception("创建Excel工作薄为空!");
        }
        Sheet sheet = null;
        Row row = null;
        Cell cell = null;

        for (int i = 0; i < work.getNumberOfSheets(); i++) {
            sheet = work.getSheetAt(i);
            if (sheet == null) {
                continue;
            }

            for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
                row = sheet.getRow(j);
                if (row == null || row.getFirstCellNum() == j) {
                    continue;
                }

                List li = new ArrayList<>();
                for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
                    String value = "";
                    cell = row.getCell(y);
                    switch (cell.getCellType()) {
                        // 数字
                        case HSSFCell.CELL_TYPE_NUMERIC:
                            //如果为时间格式的内容
                            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                //注:format格式 yyyy-MM-dd hh:mm:ss 中小时为12小时制,若要24小时制,则把小h变为H即可,yyyy-MM-dd HH:mm:ss
                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                                value=sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();
                                li.add(value);
                                break;
                            }else {
                                 value= String.valueOf(cell.getNumericCellValue());
                                String[] split = value.split("\\.");
                                //整型不保留小数部分
                                if (split[1].length()==1 && split[1].equals("0")){
                                    value = split[0];
                                    li.add(value);
                                    break;
                                }
                                li.add(value);
                                break;
                            }
                        // 字符串
                        case HSSFCell.CELL_TYPE_STRING:
                            value = cell.getStringCellValue();
                            li.add(value);
                            break;
                        // Boolean
                        case HSSFCell.CELL_TYPE_BOOLEAN:
                            value = cell.getBooleanCellValue() + "";
                            li.add(value);
                            break;
                        // 公式
                        case HSSFCell.CELL_TYPE_FORMULA:
                            value = cell.getCellFormula() + "";
                            li.add(value);
                            break;
                        // 空值
                        case HSSFCell.CELL_TYPE_BLANK:
                            value = "";
                            li.add(value);
                            break;
                        // 故障
                        case HSSFCell.CELL_TYPE_ERROR:
                            value = "非法字符";
                            li.add(value);
                            break;
                        default:
                            value = "未知类型";
                            li.add(value);
                            break;
                    }
                }
                list.add(li);
            }
        }
        return list;

    }


    /**
     * 判断文件格式
     *
     * @param inStr
     * @param fileName
     * @return
     * @throws Exception
     */
    public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception {
        Workbook workbook = null;
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        if (".xls".equals(fileType)) {
            workbook = new HSSFWorkbook(inStr);
        } else if (".xlsx".equals(fileType)) {
            workbook = new XSSFWorkbook(inStr);
        } else {
            throw new Exception("请上传excel文件!");
        }
        return workbook;
    }

} 
  

四、测试:增加静态页面和测试文件

目录结构:

SpringBoot项目中关于Excel的解析(一)_第1张图片

静态页面:index.html



    
    上传文件


测试文件:test.xlsx

SpringBoot项目中关于Excel的解析(一)_第2张图片

 

注意:访问静态页面的前端端口是在下图定义的,和访问项目的端口不是同一个

具体的访问路径是:http://localhost:8081/自己的项目名/templates/index.html

SpringBoot项目中关于Excel的解析(一)_第3张图片

五、最终测试的结果:

SpringBoot项目中关于Excel的解析(一)_第4张图片

你可能感兴趣的:(SpringBoot)