spring boot + POI 导出和导入Excel表格详细步骤

在后端项目中导出/导入Excel表格,亲测具体实现步骤为:

1.在pom.xml 中加入POI导入依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.1</version>
</dependency>

 

2.controller 层的内容

做导出数据到Excel表的功能时,主要是将所需导出的数据先给查询出来,然后再利用所写的工具类中的方法处理一下数据,保存到Excel中.

我这用的工具类是 POIUtils.

下面直接看代码:

//导出数据到Excel表
@GetMapping("/export")
 public ResponseEntity<byte[]> exportData(){
      //先从数据库获取到所需导出成Excel的表格数据
      List<Employee> list = (List<Employee>)empBasicService.getEmployee().getData();

      return POIUtils.employee2Excel(list);
  }

 //Excel表导入数据
 @PostMapping("/import")
 public RespBean importData(MultipartFile file) throws IOException {
         List<Employee> list = POIUtils.excel2Employee(file,nationService.getAllNations(),politicsstatusService.getAllPoliticsstatus(),
                departmentService.getAllDepartmentsWithOutChildren(),positionService.getAllPosition(),jobLevelService.getAllJobLevels());


        if(empBasicService.addEmps(list) == list.size()){
            System.out.println("上传成功!");
            return RespBean.ok("上传成功!");
        }
        return RespBean.error("上传失败!");
    }
package org.javaboy.vhr.utils;

import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.javaboy.vhr.model.*;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class POIUtils {
    public static ResponseEntity<byte[]> employee2Excel(List<Employee> list) {
        //1.创建一个Excel文档
        HSSFWorkbook workbook = new HSSFWorkbook();
        //2.创建文档摘要
        workbook.createInformationProperties();
        //3.获取并配置文档信息
        DocumentSummaryInformation information = workbook.getDocumentSummaryInformation();
        //文档类别
        information.setCategory("员工信息");
        //文档管理员
        information.setManager("wzy");
        //设置公司信息
        information.setCompany("从一而终");
        //4.获取文档摘要信息
        SummaryInformation summaryInfo = workbook.getSummaryInformation();
        //文档标题
        summaryInfo.setTitle("员工信息表");
        //文档作者
        summaryInfo.setAuthor("wzy");
        //备注信息
        summaryInfo.setComments("本文档由 Java 编程提供");

        //5.创建样式
        //创建标题行的样式
        HSSFCellStyle headerStyle = workbook.createCellStyle();
        headerStyle.setFillForegroundColor(IndexedColors.YELLOW.index );
        headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //创建日期的样式
        HSSFCellStyle dateCellStyle = workbook.createCellStyle();
        dateCellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));

        HSSFSheet sheet = workbook.createSheet("员工信息表");

        //设置列的宽度
        sheet.setColumnWidth(0,5*256);
        sheet.setColumnWidth(1,12*256);
        sheet.setColumnWidth(2,10*256);
        sheet.setColumnWidth(3,5*256);
        sheet.setColumnWidth(4,12*256);
        sheet.setColumnWidth(5,20*256);
        sheet.setColumnWidth(6,10*256);
        sheet.setColumnWidth(7,10*256);
        sheet.setColumnWidth(8,16*256);
        sheet.setColumnWidth(9,12*256);
        sheet.setColumnWidth(10,15*256);
        sheet.setColumnWidth(11,20*256);
        sheet.setColumnWidth(12,20*256);
        sheet.setColumnWidth(13,14*256);
        sheet.setColumnWidth(14,12*256);
        sheet.setColumnWidth(15,14*256);
        sheet.setColumnWidth(16,16*256);
        sheet.setColumnWidth(17,12*256);
        sheet.setColumnWidth(18,10*256);
        sheet.setColumnWidth(19,12*256);
        sheet.setColumnWidth(20,12*256);
        sheet.setColumnWidth(21,12*256);
        sheet.setColumnWidth(22,12*256);
        sheet.setColumnWidth(23,12*256);
        sheet.setColumnWidth(24,12*256);

        //6.创建标题行
        HSSFRow r0 = sheet.createRow(0);
        HSSFCell c0 = r0.createCell(0);
        c0.setCellValue("编号");
        c0.setCellStyle(headerStyle);

        HSSFCell c1 = r0.createCell(1);
        c1.setCellStyle(headerStyle);
        c1.setCellValue("姓名");
        HSSFCell c2 = r0.createCell(2);
        c2.setCellStyle(headerStyle);
        c2.setCellValue("工号");
        HSSFCell c3 = r0.createCell(3);
        c3.setCellStyle(headerStyle);
        c3.setCellValue("性别");
        HSSFCell c4 = r0.createCell(4);
        c4.setCellStyle(headerStyle);
        c4.setCellValue("出生日期");
        HSSFCell c5 = r0.createCell(5);
        c5.setCellStyle(headerStyle);
        c5.setCellValue("身份证号码");
        HSSFCell c6 = r0.createCell(6);
        c6.setCellStyle(headerStyle);
        c6.setCellValue("婚姻状况");
        HSSFCell c7 = r0.createCell(7);
        c7.setCellStyle(headerStyle);
        c7.setCellValue("民族");
        HSSFCell c8 = r0.createCell(8);
        c8.setCellStyle(headerStyle);
        c8.setCellValue("籍贯");
        HSSFCell c9 = r0.createCell(9);
        c9.setCellStyle(headerStyle);
        c9.setCellValue("政治面貌");
        HSSFCell c10 = r0.createCell(10);
        c10.setCellStyle(headerStyle);
        c10.setCellValue("电子邮件");
        HSSFCell c11 = r0.createCell(11);
        c11.setCellStyle(headerStyle);
        c11.setCellValue("电话号码");
        HSSFCell c12 = r0.createCell(12);
        c12.setCellStyle(headerStyle);
        c12.setCellValue("联系地址");
        HSSFCell c13 = r0.createCell(13);
        c13.setCellStyle(headerStyle);
        c13.setCellValue("所属部门");
        HSSFCell c14 = r0.createCell(14);
        c14.setCellStyle(headerStyle);
        c14.setCellValue("职位");
        HSSFCell c15 = r0.createCell(15);
        c15.setCellStyle(headerStyle);
        c15.setCellValue("职称");
        HSSFCell c16 = r0.createCell(16);
        c16.setCellStyle(headerStyle);
        c16.setCellValue("聘用形式");
        HSSFCell c17 = r0.createCell(17);
        c17.setCellStyle(headerStyle);
        c17.setCellValue("最高学历");
        HSSFCell c18 = r0.createCell(18);
        c18.setCellStyle(headerStyle);
        c18.setCellValue("专业");
        HSSFCell c19 = r0.createCell(19);
        c19.setCellStyle(headerStyle);
        c19.setCellValue("毕业院校");
        HSSFCell c20 = r0.createCell(20);
        c20.setCellStyle(headerStyle);
        c20.setCellValue("入职日期");
        HSSFCell c21 = r0.createCell(21);
        c21.setCellStyle(headerStyle);
        c21.setCellValue("转正日期");
        HSSFCell c22 = r0.createCell(22);
        c22.setCellStyle(headerStyle);
        c22.setCellValue("合同起始日期");
        HSSFCell c23 = r0.createCell(23);
        c23.setCellStyle(headerStyle);
        c23.setCellValue("合同终止日期");
        HSSFCell c24 = r0.createCell(24);
        c24.setCellStyle(headerStyle);
        c24.setCellValue("合同期限(年)");

        for (int i = 0; i < list.size(); i++) {
            Employee emp = list.get(i);
            HSSFRow row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue(emp.getId());
            row.createCell(1).setCellValue(emp.getName());
            row.createCell(2).setCellValue(emp.getWorkID());
            row.createCell(3).setCellValue(emp.getGender());

            HSSFCell cell4 = row.createCell(4);
            cell4.setCellStyle(dateCellStyle);
            cell4.setCellValue(emp.getBirthday());

            row.createCell(5).setCellValue(emp.getIdCard());
            row.createCell(6).setCellValue(emp.getWedlock());
            row.createCell(7).setCellValue(emp.getNation().getName());
            row.createCell(8).setCellValue(emp.getNativePlace());
            row.createCell(9).setCellValue(emp.getPoliticsstatus().getName());
            row.createCell(10).setCellValue(emp.getEmail());
            row.createCell(11).setCellValue(emp.getPhone());
            row.createCell(12).setCellValue(emp.getAddress());
            row.createCell(13).setCellValue(emp.getDepartment().getName());
            row.createCell(14).setCellValue(emp.getPosition().getName());
            row.createCell(15).setCellValue(emp.getJobLevel().getName());
            row.createCell(16).setCellValue(emp.getEngageForm());
            row.createCell(17).setCellValue(emp.getTiptopDegree());
            row.createCell(18).setCellValue(emp.getSpecialty());
            row.createCell(19).setCellValue(emp.getSchool());

            HSSFCell cell20 = row.createCell(20);
            cell20.setCellStyle(dateCellStyle);
            cell20.setCellValue(emp.getBeginDate());
            HSSFCell cell21 = row.createCell(21);
            cell21.setCellStyle(dateCellStyle);
            cell21.setCellValue(emp.getConversionTime());

            HSSFCell cell22 = row.createCell(22);
            cell22.setCellStyle(dateCellStyle);
            cell22.setCellValue(emp.getBeginContract());
            HSSFCell cell23 = row.createCell(23);
            cell23.setCellStyle(dateCellStyle);
            cell23.setCellValue(emp.getEndContract());

            row.createCell(24).setCellValue(emp.getContractTerm());
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        HttpHeaders headers = new HttpHeaders();

        try {
            headers.setContentDispositionFormData("attachment",new String("员工表.xls".getBytes("UTF-8"),"ISO-8859-1"));
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            workbook.write(baos);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ResponseEntity<byte[]>(baos.toByteArray(),headers, HttpStatus.CREATED);
    }

    /**
     * Excel 解析成 员工数据集合
     * @param file
     * @param allNations
     * @param allPoliticsstatus
     * @param allDepartments
     * @param allPosition
     * @param allJobLevels
     * @return
     */
    public static List<Employee> excel2Employee(MultipartFile file, List<Nation> allNations,
                                                List<Politicsstatus> allPoliticsstatus, List<Department> allDepartments,
                                                List<Position> allPosition, List<JobLevel> allJobLevels) {

        List<Employee> list = new ArrayList<>();
        Employee emp = null;

        //有异常,利用 try catch 捕获异常
        try {
            //1.创建 workbook 对象
            HSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream());
            //2.获取 workbook 中表单的数量
            int numberOfSheets = workbook.getNumberOfSheets();
            for (int i = 0; i < numberOfSheets; i++) {
                //3.获取表单
                HSSFSheet sheet = workbook.getSheetAt(i);
                //4.获取表单行数
                int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
                for (int j = 0; j <physicalNumberOfRows; j++) {
                    //5.跳过标题行
                    if(j==0){
                        continue;//跳过第一行 标题行 ,不解析
                    }
                    //6.获取行
                    HSSFRow row = sheet.getRow(j);
                    if(row == null){
                        continue;   //跳过中间有空行的情况
                    }
                    //7.获取表单中的列
                    int physicalNumberOfCells = row.getPhysicalNumberOfCells();
                    emp = new Employee();
                    for (int k = 0; k < physicalNumberOfCells; k++) {
                        HSSFCell cell = row.getCell(k);
                        switch (cell.getCellType()){
                            case STRING:
                                String cellValue = cell.getStringCellValue();
                                switch (k){
                                    case 1: emp.setName(cellValue); break;
                                    case 2: emp.setWorkID(cellValue); break;
                                    case 3: emp.setGender(cellValue); break;

                                    case 5: emp.setIdCard(cellValue); break;
                                    case 6: emp.setWedlock(cellValue); break;

                                    case 7:
                                        int nationIndex = allNations.indexOf(new Nation(cellValue));
                                        emp.setNationId(allNations.get(nationIndex).getId());
                                        break;

                                    case 8: emp.setNativePlace(cellValue); break;

                                    case 9:
                                        int polIndex = allPoliticsstatus.indexOf(new Politicsstatus(cellValue));
                                        emp.setPoliticId(allPoliticsstatus.get(polIndex).getId());
                                        break;

                                    case 10: emp.setEmail(cellValue); break;
                                    case 11: emp.setPhone(cellValue); break;
                                    case 12: emp.setAddress(cellValue); break;

                                    case 13:
                                        int depIndex = allDepartments.indexOf(new Department(cellValue));
                                        emp.setDepartmentId(allDepartments.get(depIndex).getId());
                                        break;
                                    case 14:
                                        int posIndex = allPosition.indexOf(new Position(cellValue));
                                        emp.setPosId(allPosition.get(posIndex).getId());
                                        break;
                                    case 15:
                                        int jobLevelsIndex = allJobLevels.indexOf(new JobLevel(cellValue));
                                        emp.setJobLevelId(allJobLevels.get(jobLevelsIndex).getId());
                                        break;

                                    case 16: emp.setEngageForm(cellValue); break;
                                    case 17: emp.setTiptopDegree(cellValue); break;
                                    case 18: emp.setSpecialty(cellValue); break;
                                    case 19: emp.setSchool(cellValue); break;
                                }
                                break;
                            default:{
                                switch (k){
                                    case 4: emp.setBirthday(cell.getDateCellValue()); break;
                                    case 20: emp.setBeginDate(cell.getDateCellValue()); break;
                                    case 21: emp.setConversionTime(cell.getDateCellValue()); break;
                                    case 22: emp.setBeginContract(cell.getDateCellValue()); break;
                                    case 23: emp.setEndContract(cell.getDateCellValue()); break;
                                    case 24: emp.setContractTerm(cell.getNumericCellValue()); break;
                                }
                             }
                             break;
                        }
                    }
                    list.add(emp);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        return list;
    }
}
 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值