【Java】使用esayExcel进行导出、导入包含多个sheet页面


<!--easyexcel -->
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>easyexcel</artifactId>
     <version>2.2.6</version>
 </dependency>

本文教程适合小白直接使用:先导出excel(含多个sheet),后导入,以上为导入依赖

导出excel(含多个sheet页,第一个sheet导出现有的数据,第二个sheet导出无数据)

        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        try {
        	//先设置了导出表头,详细在csdn查看如何设置导出表头
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            String fileName = URLEncoder.encode("AI机器人自动武器填充", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
            Workbook workbook = EasyExcelUtil.getWorkbook(excelWriter);

            //第一个表格
            WriteSheet batchEditDepartment = EasyExcel.writerSheet(0, "AI全方位攻略顶实验室").head(BatchEditDeptInfo.class).build();
            //第一个表格是有数据的,所以去数据库随便查一个表,查完后,为了便于用户使用要针对数据处理
            List<BatchEditDeptInfo> vos = this.deptInfoMapper.queryAllDeptInfoByCompanyCode(companyCode);

            Map<String, String> deptCodeAndDeptNameMap = new HashMap<>();

            if (CollectionUtils.isNotEmpty(vos)) {
                for (BatchEditDeptInfo vo : vos) {
                    deptCodeAndDeptNameMap.put(vo.getDeptCode(),vo.getDeptName());
                }
            }

            if (CollectionUtils.isNotEmpty(vos)) {
                for (BatchEditDeptInfo vo : vos) {
                    //上级部门名称
                    if (StringUtils.isNotEmpty(vo.getParentCode())) {
                        if (!"0".equals(vo.getParentCode())) {
                            String parentName = deptCodeAndDeptNameMap.get(vo.getParentCode());
                            vo.setParentName(parentName);
                        }
                    }
                    //部门负责人
                    List<String> employeeCodes = departmentHeadService.queryDepartmentHeadListByDeptCode(vo.getDeptCode());
                    if (CollectionUtils.isNotEmpty(employeeCodes)) {
                        StringBuilder chargeMan = new StringBuilder();
                        StringBuilder chargeManPhone = new StringBuilder();
                        for (int i = 0; i < employeeCodes.size(); i++) {
                            EmployeeInfoVO info = employeeInfoService.queryEmployeeInfoByEmployeeCode(employeeCodes.get(i));
                            if (i == employeeCodes.size() - 1) {
                                if (StringUtils.isNotEmpty(info.getEmployeeName())) {
                                    chargeMan.append(info.getEmployeeName());
                                }
                                if (StringUtils.isNotEmpty(info.getPhoneNum())) {
                                    chargeManPhone.append(info.getPhoneNum());
                                }

                            } else {
                                if (StringUtils.isNotEmpty(info.getEmployeeName())) {
                                    chargeMan.append(info.getEmployeeName()).append('、');
                                }

                                if (StringUtils.isNotEmpty(info.getPhoneNum())) {
                                    chargeManPhone.append(info.getPhoneNum()).append('、');
                                }
                            }
                        }
                        vo.setPhone(chargeManPhone.toString());
                        vo.setEmployeeName(chargeMan.toString());
                    }

                    //部门类型
                    if (StringUtils.isNotEmpty(vo.getDepartmentType())) {
                        if ("0".equals(vo.getDepartmentType())) {
                            vo.setDepartmentType("AI黑客部");
                        } else if ("1".equals(vo.getDepartmentType())) {
                            vo.setDepartmentType("AI军事部");
                        } else if ("-1".equals(vo.getDepartmentType())){
                            vo.setDepartmentType("AI能源部");
                        }
                    }

                    //部门类别
                    if (ObjectUtils.isNotEmpty(vo.getCategoryId())) {
                        CompanyDepartmentCategory category = categoryMapper.selectById(vo.getCategoryId());
                        vo.setCategoryValue(category.getCategoryValue());
                    }
                }
            }

            excelWriter.write(vos, batchEditDepartment);

            //设置导出的字体(第一个表格)
            Font firstSheetFirstFont = workbook.createFont();
            firstSheetFirstFont.setColor(IndexedColors.RED1.getIndex());

            //单元格风格 one:控制特殊字体 TWO:控制通用字体
            CellStyle cellStyleOne = workbook.createCellStyle();
            cellStyleOne.setAlignment(HorizontalAlignment.CENTER);
            cellStyleOne.setVerticalAlignment(VerticalAlignment.CENTER);
            cellStyleOne.setFillBackgroundColor(IndexedColors.WHITE.getIndex());
            cellStyleOne.setFont(firstSheetFirstFont);
            //单元格风格 2
            CellStyle cellStyleTwo = workbook.createCellStyle();
            cellStyleTwo.setAlignment(HorizontalAlignment.CENTER);
            cellStyleTwo.setVerticalAlignment(VerticalAlignment.CENTER);
            cellStyleTwo.setFillBackgroundColor(IndexedColors.WHITE.getIndex());

            //第一个表的表头风格设置
            Row firstSheetRow = workbook.getSheet("AI全方位攻略顶实验室").getRow(0);
            firstSheetRow.getCell(1).setCellStyle(cellStyleOne);
            firstSheetRow.getCell(8).setCellStyle(cellStyleOne);
            firstSheetRow.getCell(2).setCellStyle(cellStyleOne);
            firstSheetRow.getCell(0).setCellStyle(cellStyleTwo);
            firstSheetRow.getCell(3).setCellStyle(cellStyleTwo);
            firstSheetRow.getCell(4).setCellStyle(cellStyleTwo);
            firstSheetRow.getCell(5).setCellStyle(cellStyleTwo);
            firstSheetRow.getCell(6).setCellStyle(cellStyleTwo);
            firstSheetRow.getCell(7).setCellStyle(cellStyleTwo);
            firstSheetRow.getCell(9).setCellStyle(cellStyleTwo);

            //冻结1:excel的冻结需要锁表
            Sheet sheetAt = workbook.getSheetAt(0);
            int totalData = sheetAt.getPhysicalNumberOfRows();
//            sheetAt.createFreezePane(1,totalData,2,totalData);
            //冻结第一列
            sheetAt.createFreezePane(2,0,2,0);
//            //锁表
//            sheetAt.protectSheet("111");
            //可以选择:隐藏第第一列
            sheetAt.setColumnHidden(1,true);


            List<DeptTemplateExport2> exportArrayList = new ArrayList<>();
            //第二个sheet页面,空数据
            WriteSheet firstSheet = EasyExcel.writerSheet(1, "AI失控自毁列表").head(DeptTemplateExport2.class).build();
            excelWriter.write(exportArrayList, firstSheet);
            //给第一个导出的表格设置字体和样式
            Row firstSheetFirstRow = workbook.getSheet("AI失控自毁数据").getRow(0);

            firstSheetFirstRow.getCell(0).setCellStyle(cellStyleOne);
            firstSheetFirstRow.getCell(1).setCellStyle(cellStyleOne);
            firstSheetFirstRow.getCell(2).setCellStyle(cellStyleOne);
            firstSheetFirstRow.getCell(7).setCellStyle(cellStyleOne);

            firstSheetFirstRow.getCell(3).setCellStyle(cellStyleTwo);
            firstSheetFirstRow.getCell(4).setCellStyle(cellStyleTwo);
            firstSheetFirstRow.getCell(5).setCellStyle(cellStyleTwo);
            firstSheetFirstRow.getCell(6).setCellStyle(cellStyleTwo);
            firstSheetFirstRow.getCell(8).setCellStyle(cellStyleTwo);
            excelWriter.finish();
        } catch (IOException e) {
            logger.error("导出异常:{}", e.getMessage());
            throw new ServiceNewException(FoundationErrorMapping.GENERAL_SERVICE_EXCEPTION, "导出异常");
        }

以上就是导出excel含2个sheet页的基础代码,若是代码太多,建议处理:两个表都用 new ArrayList<自定义实体类>(),填充数据即可,导出导入亲测无问题。

读取刚刚导出的excel表格(多sheet页)

esayExcel要读取多个sheet页提供了监视器,针对每个sheet建立一个监视器,以下代码可以直接复制粘贴

public class BatchEditDeptInfoListener extends AnalysisEventListener<BatchEditDeptInfo> {

	private List<BatchEditDeptInfo> list = new ArrayList<>();

	@Override
	public void invoke(BatchEditDeptInfo data, AnalysisContext context) {
		list.add(data);
	}

	@Override
	public void doAfterAllAnalysed(AnalysisContext context) {
	}

	public List<BatchEditDeptInfo> getData() {
		return list;
	}

}

第二个表格的监视器

public class DeptTemplateExport2Listener extends AnalysisEventListener<DeptTemplateExport2> {

    private List<DeptTemplateExport2> list = new ArrayList<>();

    @Override
    public void invoke(DeptTemplateExport2 data, AnalysisContext context) {
        list.add(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

    }


    public List<DeptTemplateExport2> getData() {
        return list;
    }

}

获取表格中的数据

ExcelReader excelReader = EasyExcel.read(file.getInputStream()).build();
                BatchEditDeptInfoListener batchEditDeptInfoListener = new BatchEditDeptInfoListener();
                DeptTemplateExport2Listener deptTemplateExport2Listener = new DeptTemplateExport2Listener();
                ReadSheet sheet1 = EasyExcel.readSheet(0).head(BatchEditDeptInfo.class).registerReadListener(batchEditDeptInfoListener).build();
                ReadSheet sheet2 = EasyExcel.readSheet(1).head(DeptTemplateExport2.class).registerReadListener(deptTemplateExport2Listener).build();
                excelReader.read(sheet1,sheet2);
                excelReader.finish();
              List<BatchEditDeptInfo>  readExcelZero = batchEditDeptInfoListener.getData();
              List<DeptTemplateExport2>  readExcelOne = deptTemplateExport2Listener.getData();

得到每个表格导入的数据,最后根据需求进行校验,获取有效数据即可。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用EasyExcel读取Excel文件的全部sheet页数据很简单,只需要使用`ExcelReader`类即可,具体操作如下: ```java ExcelReader excelReader = new ExcelReader(inputStream, null, new AnalysisEventListener<Data>() { @Override public void invoke(Data data, AnalysisContext context) { // 处理每一行数据 } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 处理完所有数据后的操作 } @Override public boolean hasNext(AnalysisContext context) { // 判断是否还有下一行数据 return true; } @Override public void onException(Exception exception, AnalysisContext context) { // 出现异常时的操作 } @Override public void onException(Exception exception) { // 出现异常时的操作 } }); List<Sheet> sheets = excelReader.getSheets(); for (Sheet sheet : sheets) { excelReader.read(sheet); } excelReader.finish(); ``` 其中,`Data`是你要读取的每行数据对应的实体类,可以根据实际情况自行修改。`AnalysisEventListener`接口实现了对Excel数据的监听,可以在其中处理每行数据、处理完所有数据后的操作、判断是否还有下一行数据以及出现异常时的操作等。 `ExcelReader`类的构造方法中,第一个参数是要读取的Excel文件的输入流,第二个参数是读取时的一些配置,可以为null,第三个参数是实现了`AnalysisEventListener`接口的监听器对象。 `excelReader.getSheets()`方法可以获取Excel文件中所有的sheet页,然后遍历每个sheet页,调用`excelReader.read(sheet)`方法读取每个sheet页的数据。 需要注意的是,`excelReader.finish()`方法必须要调用,以便释放资源。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值