欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-21 13:10:10
...

在后端项目中导出/导入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;
    }
}
 
相关标签: POI java poi