Spring Boot+Mybatis excel导入导出(多sheet页)

首先导入poi包
      <!--excel poi-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.1</version>
        </dependency>

静态资源

public  class publicStc {

    //---------------------------------导出学生静态资源---------------------------------------------------------
    //导出学生对象页签
    public static String [] studentTab={"学生信息"};

    //学生标题
    public static  String[] studentTitle={"学生编号","学生姓名","学生年龄",};

    //-----------------------------------导出班级静态资源-------------------------------------------------------

    //导出学生对象页签
    public static String [] clazzTab={"班级信息"};

    //导出班级对象页签
    public static  String[] clazzTitle={"班级编号","班级名称"};




    //-------------------------------------导入学生静态资源-----------------------------------------------------

    //导入学生对象属性
    public static  String[] studentProperty = {"name", "age"};

    //-------------------------------------导入班级静态资源-----------------------------------------------------

    //导入班级对象属性
    public static String[] clazzProperty={"name"};


}

excel导入

Controller层

	/**
     * excel导入
     * @param request
     * @return
     */
    @PostMapping(value = "/upload")
    public String uploadExcel(HttpServletRequest request){
        String msg="";
        try {
            //获取MultipartHttpServletRequest对象
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            MultipartFile file = multipartRequest.getFile("filename");
            //判断文件是否为空
            if(isNotNull(file)){
                return "文件不能为空!";
            }
            //获取文件流
            InputStream inputStream = file.getInputStream();
            //解析excel,并导入
            msg=studentService.getBankListByExcel(inputStream,file.getOriginalFilename());
            //关闭文件流
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return msg;
    }

Service层

/**
     * 获取excel数据
     * @param inputStream 流
     * @param filName 文件名
     * @return
     */
    @Transactional
    @Override
    public String getBankListByExcel(InputStream inputStream, String filName)  {
        //属性容器
        List<String[]> listProperty=new ArrayList<>();
        //sheet容器
        List<String[]> listTab=new ArrayList<>();
        //获取学生要导入的属性
        listProperty.add(publicStc.studentProperty);
        //获取班级要导入的属性
        listProperty.add(publicStc.clazzProperty);
        //获取学生sheet
        listTab.add(publicStc.studentTab);
        //获取班级sheet
        listTab.add(publicStc.clazzTab);
        //获取excel数据转换成map的格式
        Map<String,List<Map<String,Object>>> map= ExcelUtil.getExcelDate(inputStream,filName,listProperty,listTab);
        //循环拆分数据
        Set<String> keys = map.keySet();
        for (String key: keys) {
            switch (key) {
                //学生
                case "学生信息":
                    studentMapper.saveStudent(map.get(key));
                    break;
                //班级
                case "班级信息":
                    clazzmapper.insertClazz(map.get(key));
                    break;
                default:
                    break;
            }
        }
        return "导入成功";
    }

ExcelUtil,这个地方是没法保证导入的excel是恶意的excel(脏数据),但是有一点,大家要清楚,excel导入一些场景是不存在的,存在大多数是后台的。虽然没能完全保证数据有效性,但是我这里做了一个sheet名称的验证。

 /**
     * 获取excel数据
     * @param inputStream
     * @param filName
     * @return
     */
    public static Map<String,List<Map<String,Object>>> getExcelDate(InputStream inputStream, String filName, List<String[]> Property, List<String[]> listTab){
        //存储所有页签数据
        Map<String,List<Map<String,Object>>> resultmap=new HashMap<>();
        try {
            //创建Excel工作薄
            Workbook work =getWorkbook(inputStream,filName);
            if (null == work) {
                throw new Exception("创建Excel工作薄为空!");
            }
            Sheet sheet;
            Row row;
            Cell cell;
            for (int i = 0; i < work.getNumberOfSheets(); i++) {
                //存储当前页签数据
                List<Map<String,Object>> list=new ArrayList<>();
                //获取当前页签
                sheet = work.getSheetAt(i);
                //判断页签是否为空和页签是否是正确的页签
                if (sheet == null||(!sheet.getSheetName().equals(listTab.get(i)[0]))) {
                    continue;
                }
                for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
                    row = sheet.getRow(j);
                    if (row == null || row.getFirstCellNum() == j) {
                        continue;
                    }
                    //存储当前一行数据
                    Map<String,Object> map=new HashMap<>();
                    for (int y = row.getFirstCellNum(); y < Property.get(i).length; y++) {
                        cell = row.getCell(y);
                        map.put(Property.get(i)[y],cell.toString());
                    }
                    list.add(map);
                }
                resultmap.put(listTab.get(i)[0],list);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultmap;
    }

excel导出

Controller层

/**
     * 导出excel(多sheet页)
     * @param response
     * @return
     */
    @GetMapping(value = "/exportexcel")
    public void exportExcel(HttpServletResponse response){
        try {
            //根据前端勾选导出模拟的数据
            String[] args={"学生信息","班级信息"};
            studentService.exportExcel(response,args);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Service层

/**
     *
     * @param response
     * @param args 要导出的信息
     * @throws IOException
     */
    @Override
    public void exportExcel(HttpServletResponse response,String[] args) throws IOException {
        //页签容器
        List<String[]>  tab=new ArrayList<>();
        //标题容器
        List<String[]> title =new ArrayList<>();
        //数据容器
        List<List<Map<String,Object>>> list=new ArrayList<>();
        //根据前端选中的值进行导出
        for (int i = 0; i <args.length; i++) {
            switch(args[i]){
                //学生
                case "学生信息":
                    //获取页签
                    tab.add(publicStc.studentTab);
                    //获取标题
                    title.add(publicStc.studentTitle);
                    //查询学生
                    list.add(studentMapper.getStudentList());
                    break;
                //班级
                case "班级信息":
                    //获取页签
                    tab.add(publicStc.clazzTab);
                    //获取标题
                    title.add(publicStc.clazzTitle);
                    //查询学生
                    list.add(clazzmapper.getClazzList());
                    break;
                default:
                    break;
            }
        }
        //导出excel
        ExcelUtil.exportExcel(response,list,tab,title);
    }

ExcelUtil,这个不需要担心excel文件名称乱码,这个问题我已经解决。

/**
     * 创建excel并导出数据到excel中
     * @param response 流
     * @param list 数据
     * @param tab 页签
     * @param title 标题
     * @throws IOException
     */
    public static void exportExcel(HttpServletResponse response,List<List<Map<String,Object>>> list,List<String []> tab,List<String []> title) throws IOException {
        //实例化HSSFWorkbook
        HSSFWorkbook workbook = new HSSFWorkbook();
        for (int p = 0; p < tab.size(); p++) {
            for (int i = 0; i <tab.get(p).length; i++) {
                //创建一个Excel表单,参数为sheet的名字
                HSSFSheet sheet = workbook.createSheet(tab.get(p)[i]);
                //设置表格列宽度为10个字节
                sheet.setDefaultColumnWidth(10);
                //创建标题的显示样式
                HSSFCellStyle headerStyle = workbook.createCellStyle();
                headerStyle.setFillForegroundColor(IndexedColors.YELLOW.index);
                headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                //创建第一行表头
                HSSFRow headrow = sheet.createRow(0);
                //遍历添加标题
                for (int j = 0; j <title.get(p).length; j++) {
                    //创建一个单元格
                    HSSFCell cell = headrow.createCell(j);
                    //创建一个内容对象
                    HSSFRichTextString text = new HSSFRichTextString(title.get(p)[j]);
                    //将内容对象的文字内容写入到单元格中
                    cell.setCellValue(text);
                    cell.setCellStyle(headerStyle);
                }
                //添加数据
                for (int j = 0; j <list.get(p).size(); j++) {
                    //创建一行
                    HSSFRow row1 = sheet.createRow(j+1);
                    //找到key
                    Set<String> key = list.get(p).get(j).keySet();
                    int colum=0;
                    //循环key将value值存储到excel中
                    for(String s : key){
                        row1.createCell(colum++).setCellValue(new HSSFRichTextString(list.get(p).get(j).get(s).toString()));
                    }
                }
            }
        }
        //准备将Excel的输出流通过response输出到页面下载
        //八进制输出流
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("utf-8");
        //这后面可以设置导出Excel的名称,此例中名为student.xls(解决文件名称乱码问题)
        response.setHeader("content-disposition", "attachment;filename=" + new String("中心小学".getBytes(), "ISO8859-1") + ".xls" );
        //刷新缓冲
        response.flushBuffer();
        //workbook将Excel写入到response的输出流中,供页面下载
        workbook.write(response.getOutputStream());
    }

想要源码请留言

你可能感兴趣的:(springboot,Mybatis)