@Slf4j
public class ExcelUtils {

    private final static String xls = "xls";
    private final static String xlsx = "xlsx";
    private final static String csv = "csv";

    /**
     * 校验Excel
     *
     * @param file 文件
     */
    public static void checkFile(MultipartFile file) {
        //判断文件是否存在
        if (null == file) {
            log.error("文件不存在!");
            throw new BusinessException("文件不存在");
        }
        //获得文件名
        String fileName = file.getOriginalFilename();
        if (StringUtils.isBlank(fileName)) {
            log.error("文件名称不存在!");
            throw new BusinessException("文件名称不存在");
        }
        //判断文件是否是excel文件
        if (!fileName.endsWith(xls) && !fileName.endsWith(xlsx) && !fileName.endsWith(csv)) {
            log.error("文件不是excel文件");
            throw new BusinessException("文件不是excel文件");
        }
    }

    /**
     * 导出Excel
     *
     * @param workbook
     * @param response
     * @return
     */
    public static void exportExcelName(Workbook workbook, HttpServletResponse response, String fileName) {
        try {
            OutputStream out = response.getOutputStream();
            String fileNameStr = fileName + ".xls";
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileNameStr, "utf-8"));
            BufferedOutputStream bufferedOutPut = new BufferedOutputStream(out);
            bufferedOutPut.flush();
            workbook.write(bufferedOutPut);
            bufferedOutPut.close();
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 上传Excel
     *
     * @param
     * @param titleRows
     * @param headerRows
     * @param pojoClass
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
        if (inputStream == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        List<T> list;
        try {
            list = ExcelImportUtil.importExcel(inputStream, pojoClass, params);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("Excel导入异常", e);
            throw new BusinessException("Excel导入异常");
        }
        return list;
    }


    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            log.error("[monitor][IO][表单功能]", e);
        }
    }

    /**
     * 下载
     *
     * @param fileName  文件名称
     * @param sheetName sheet名称
     * @param title     表格标题
     * @param values    内容
     * @return Excel
     */
    public static ResponseEntity<Resource> download(String fileName, String sheetName, String[] title, String[][] values, boolean cvs) {
        ByteArrayOutputStream bos = null;
        String expandedName = ".xlsx";
        String contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        if (cvs) {
            bos = createCvsOutStream(title, values);
            expandedName = ".csv";
            contentType = "text/csv";
        } else {
            Workbook workbook = getWorkbook(sheetName, title, values);
            try {
                bos = new ByteArrayOutputStream();
                workbook.write(bos);
            } catch (Exception e) {
                log.error("get workbook", e);
            }
        }
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");
        headers.add("charset", "utf-8");
        try {
            //设置下载文件名
            fileName = new String((fileName + expandedName).getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
            headers.add("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
            assert bos != null;
            Resource resource = new InputStreamResource(new ByteArrayInputStream(bos.toByteArray()));
            return ResponseEntity.ok().headers(headers).contentType(MediaType.parseMediaType(contentType)).body(resource);
        } catch (Exception e) {
            log.error("download", e);
        }
        return ResponseEntity.noContent().build();
    }


    /**
     * 下载文件流
     *
     * @param sheetName sheet名称
     * @param title     表格标题
     * @param values    内容
     * @return ByteArrayInputStream
     */
    public static ByteArrayInputStream downloadSteam(String sheetName, String[] title, String[][] values, boolean cvs) {
        ByteArrayOutputStream bos = null;
        Workbook workbook = getWorkbook(sheetName, title, values);
        try {
            bos = new ByteArrayOutputStream();
            workbook.write(bos);
        } catch (Exception e) {
            log.error("get workbook", e);
        }
        assert bos != null;
        return new ByteArrayInputStream(bos.toByteArray());
    }

    /**
     * 导出Excel
     *
     * @param sheetName sheet名称
     * @param title     标题
     * @param values    内容
     * @return excel
     */
    public static Workbook getWorkbook(String sheetName, String[] title, String[][] values) {
        // 第一步,创建一个Workbook,对应一个Excel文件
        Workbook wb = new SXSSFWorkbook();
        // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
        Sheet sheet = wb.createSheet(sheetName);
        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
        Row row = sheet.createRow(0);
        // 第四步,创建单元格,并设置值表头 设置表头居中
        CellStyle style = wb.createCellStyle();
        //声明列对象
        Cell cell = null;
        //创建标题
        for (int i = 0; i < title.length; i++) {
            cell = row.createCell(i);
            cell.setCellValue(title[i]);
            cell.setCellStyle(style);
        }
        //创建内容
        for (int i = 0; i < values.length; i++) {
            row = sheet.createRow(i + 1);
            for (int j = 0; j < values[i].length; j++) {
                //将内容按顺序赋给对应的列对象
                row.createCell(j).setCellValue(values[i][j]);
            }
        }
        return wb;
    }

    public static ByteArrayOutputStream createCvsOutStream(String[] titles, String[][] values) {
        ByteArrayOutputStream bos = null;
        try {
            bos = new ByteArrayOutputStream();
            StringBuilder datas = new StringBuilder();
            // 写入文件头部
            int i = 0;
            for (String title : titles) {
                datas.append("\"").append(title).append("\"");
                if (i + 1 < titles.length) {
                    datas.append(",");
                }
                i++;
            }
            datas.append("\r\n");
            // 写入文件内容
            for (String[] row : values) {
                i = 0;
                for (String cell : row) {
                    datas.append("\"").append(cell).append("\"");
                    if (i + 1 < row.length) {
                        datas.append(",");
                    }
                    i++;
                }
                datas.append("\r\n");
            }
            bos.write(datas.toString().getBytes("GB2312"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bos;
    }

}

导出模板

public void wmPickUpReport(String startTime, String endTime, HttpServletResponse response) {
    // 数据源
    List<ExportPickUpExcel> exportPickUpExcels = new ArrayList<>();

    try {
        // 每次只处理的条数
        int pointsDataLimit = 10;
        // 临时存储数据 - 集合
        List<CarNavigation> navigationList = new ArrayList<>();
        // 分批次处理
        for (int i = 0; i < carNavigationList.size(); i++) {
            // 将10条数据加到临时集合中处理
            navigationList.add(carNavigationList.get(i));
            if (pointsDataLimit == navigationList.size() || i == carNavigationList.size() - 1) {
                // 业务功能呢
                for (CarNavigation navigation : navigationList) { 
                ExportPickUpExcel  excel = new ExportPickUpExcel();
                    exportPickUpExcels.add(excel);
                }
                // 清空临时空间 释放内存
                log.info("clear informationList =======>>>>> " + navigationList.size() + " navigation Data!");
                navigationList.clear();
            }
        }
        // 数据导出
        //FileWithExcelUtil.exportExcel(exportPickUpExcels, "数据报表", "数据报表", ExportPickUpExcel.class, "数据报表.xls", response);
        ExportParams exportParams = new ExportParams();
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, ExportPickUpExcel.class, exportPickUpExcels);
        ExcelUtils.exportExcelName(workbook, response, "威马接送数据报表");
        workbook.write(response.getOutputStream());
        response.flushBuffer();
        log.info("数据导出成功!!");
    } catch (Exception e) {
        log.info("exportExcel", e);
        log.info("数据导出失败!!");
     }
}