Implementing Excel Import and Export with EasyExcel in Java

Exporting Data to Excel

1. Adding Maven Dependency

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.7</version>
</dependency>

2. Defining Data Model with Annotations

@Data
public class ScheduleRecord {
    @ExcelProperty(value = "Start Date")
    private String beginDate;
    @ExcelProperty(value = "Start Time")
    private String beginTime;
    @ExcelProperty(value = "End Date")
    private String finishDate;
    @ExcelProperty(value = "End Time")
    private String finishTime;
    @ExcelProperty(value = "Participant Name")
    private String participantName;
    @ExcelProperty(value = "Age")
    private String participantAge;
}

3. Implementing Auto Column Width Strategy

public class AutoColumnWidthStrategy extends AbstractColumnWidthStyleStrategy {
    private static final int MAXIMUM_WIDTH = 255;
    private static final int MINIMUM_WIDTH_MULTIPLIER = 2;
    private final Map<Integer, Map<Integer, Integer>> widthCache = new HashMap<>(8);

    @Override
    protected void setColumnWidth(WriteSheetHolder sheetHolder, List<CellData> cellDataList, 
                                 Cell cell, Head head, Integer rowIndex, Boolean isHeader) {
        if (!isHeader && CollectionUtils.isEmpty(cellDataList)) {
            return;
        }

        Map<Integer, Integer> columnWidthMap = widthCache.computeIfAbsent(
            sheetHolder.getSheetNo(), k -> new HashMap<>(16));

        int calculatedWidth = calculateCellWidth(cellDataList, cell, isHeader);
        if (calculatedWidth >= 0) {
            calculatedWidth = Math.min(calculatedWidth, MAXIMUM_WIDTH);
            if (calculatedWidth < MINIMUM_WIDTH_MULTIPLIER) {
                calculatedWidth *= MINIMUM_WIDTH_MULTIPLIER;
            }

            Integer currentMaxWidth = columnWidthMap.get(cell.getColumnIndex());
            if (currentMaxWidth == null || calculatedWidth > currentMaxWidth) {
                columnWidthMap.put(cell.getColumnIndex(), calculatedWidth);
                sheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), calculatedWidth * 256);
            }
        }
    }

    private int calculateCellWidth(List<CellData> cellDataList, Cell cell, Boolean isHeader) {
        if (isHeader) {
            return cell.getStringCellValue().getBytes().length;
        }
        
        CellData data = cellDataList.get(0);
        CellDataTypeEnum dataType = data.getType();
        if (dataType == null) {
            return -1;
        }

        switch (dataType) {
            case STRING:
                return data.getStringValue().getBytes().length;
            case BOOLEAN:
                return String.valueOf(data.getBooleanValue()).getBytes().length;
            case NUMBER:
                return String.valueOf(data.getNumberValue()).getBytes().length;
            default:
                return -1;
        }
    }
}

4. Exporting Excel File

public void exportScheduleData(HttpServletResponse response) throws IOException {
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    
    LocalDate today = LocalDate.now();
    String encodedFileName = URLEncoder.encode("Schedule_Report", "UTF-8").replaceAll("\\+", "%20");
    response.setHeader("Content-disposition", 
        "attachment;filename*=UTF-8''" + encodedFileName + ".xlsx");
    response.setHeader("Access-Control-Expose-Headers", "filename");
    response.setHeader("filename", encodedFileName + ".xlsx");

    List<ScheduleRecord> records = scheduleService.getAllRecords();
    
    EasyExcel.write(response.getOutputStream(), ScheduleRecord.class)
        .sheet("Schedule Data")
        .registerWriteHandler(new AutoColumnWidthStrategy())
        .doWrite(records);
}

Importing Data from Excel

1. Creating Excel Analysis Listener

public class ExcelDataListener<T> extends AnalysisEventListener<T> {
    private final List<T> collectedData = new ArrayList<>();

    @Override
    public void invoke(T dataInstance, AnalysisContext context) {
        collectedData.add(dataInstance);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // Post-processing logic after complete analysis
    }

    public List<T> getCollectedData() {
        return collectedData;
    }
}

2. Processing Excel Upload

public ResponseEntity<Map<String, Object>> processExcelUpload(
        @RequestParam("document") MultipartFile file) throws Exception {
    
    ExcelDataListener<ScheduleRecord> firstSheetListener = new ExcelDataListener<>();
    EasyExcel.read(file.getInputStream(), ScheduleRecord.class, firstSheetListener)
        .sheet(0).doRead();
    List<ScheduleRecord> firstSheetData = firstSheetListener.getCollectedData();

    ExcelDataListener<ParticipantInfo> secondSheetListener = new ExcelDataListener<>();
    EasyExcel.read(file.getInputStream(), ParticipantInfo.class, secondSheetListener)
        .sheet(1).doRead();
    List<ParticipantInfo> secondSheetData = secondSheetListener.getCollectedData();

    Map<String, Object> processingResult = excelService.processUploadedData(
        firstSheetData, secondSheetData);
    
    return ResponseEntity.ok(processingResult);
}

Tags: java EasyExcel Excel import export

Posted on Mon, 19 Oct 2026 16:38:12 +0000 by shlomikalfa