EasyExcel部分学习随笔


自己写了一个工具类


import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.suntang.dcm.common.dto.ExportExcelDTO;
import com.suntang.dcm.common.response.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Component
public class ExcelUtil {

    /**
     * 校验文件格式是否是Excel
     *
     * @return
     */
    public static boolean verifyFileFormat(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        log.info("originalFilename:{}", originalFilename);
        if (StrUtil.isNotBlank(originalFilename)) {
            assert originalFilename != null;
            originalFilename = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            return "xls".equals(originalFilename) || "xlsx".equals(originalFilename);
        }
        return true;
    }

    /**
     * 封装一下基于EasyExcel的导出方法
     *
     * @param response
     * @param excelDTO
     * @throws IOException
     */
    public static void export(HttpServletResponse response, ExportExcelDTO excelDTO) throws IOException {
        String fileName = URLEncoder.encode(excelDTO.getFileName(), "UTF-8");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", String.join("", "attachment;filename=", fileName, ".xlsx"));
        EasyExcel.write(response.getOutputStream(), excelDTO.getBaseClass())
                .sheet(excelDTO.getSheetName())
                .doWrite(excelDTO.getDataList());
    }

    /**
     * 导出路径上的Excel模板
     *
     * @param response
     * @param filePath
     * @param exportFileName
     * @throws IOException
     */
    public static void exportExcelTemplate(HttpServletResponse response, String filePath, String exportFileName) throws IOException {
        log.info("ExcelUtil.exportExcelTemplate.filePath:{}", filePath);
        // 构建文件路径
        File file = new File(filePath);
        if (!file.exists()) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            response.setContentType("text/plain;charset=UTF-8");
            response.getWriter().write("文件不存在。");
            return;
        }
        String fileName = URLEncoder.encode(exportFileName, "UTF-8");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", String.join("", "attachment;filename=", fileName, ".xlsx"));
        // 将文件写入响应输出流
        try (FileInputStream fis = new FileInputStream(file);
             OutputStream os = response.getOutputStream()) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 有表头没数据的模板
     *
     * @param response
     * @param headerList
     * @param exportFileName
     * @throws IOException
     */
    public static void exportExcelByHeaderList(HttpServletResponse response, List<String> headerList, String exportFileName) throws IOException {
        List<List<String>> headers = new ArrayList<>();
        headerList.forEach(res -> {
            List<String> column = new ArrayList<>();
            column.add(res);
            headers.add(column);
        });
        String fileName = URLEncoder.encode(exportFileName, "UTF-8");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", String.join("", "attachment;filename=", fileName, ".xlsx"));
        EasyExcel.write(response.getOutputStream())
                .head(headers)
                .sheet("sheet1")
                .doWrite(new ArrayList<>());
    }


}

ExportExcelDTO


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @author YoonaDa
 * @email lintiaoda@suntang.com
 * @description:
 * @date 2022-03-09 18:07
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExportExcelDTO {

    /**
     * 导出时显示的文件名
     */
    private String fileName;

    /**
     * 默认第一个sheet的名字
     */
    private String sheetName;

    /**
     * 数据转换映射的类
     */
    private Class<?> baseClass;

    /**
     * 列表数据
     */
    private List<?> dataList;
    
}

DynamicEasyExcelImportUtil (动态表头导入)

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.util.CollectionUtils;
import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
import com.suntang.dcm.dg.listener.DynamicEasyExcelListener;

import java.io.ByteArrayInputStream;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * @author YoonaDa
 * @email lintiaoda@suntang.com
 * @description:
 * @date 2023-05-10 16:54
 */
public class DynamicEasyExcelImportUtil {

    /**
     * 动态获取全部列和数据体
     *
     * @param stream         excel文件流
     * @param parseRowNumber 指定读取行
     * @return
     */
    public static List<Map<String, String>> parseExcelToView(byte[] stream, Integer parseRowNumber) throws Exception {
        if (Objects.isNull(parseRowNumber)) {
            // 默认从第一行开始解析数据
            parseRowNumber = 1;
        }
        DynamicEasyExcelListener readListener = new DynamicEasyExcelListener();
        EasyExcelFactory.read(new ByteArrayInputStream(stream))
                .registerReadListener(readListener)
                .headRowNumber(parseRowNumber)
                .sheet(0)
                .doRead();
        List<Map<Integer, String>> headList = readListener.getHeadList();
        if (CollectionUtils.isEmpty(headList)) {
            throw new Exception("Excel未包含表头");
        }
        List<Map<Integer, String>> dataList = readListener.getDataList();
        if (CollectionUtils.isEmpty(dataList)) {
            throw new Exception("Excel未包含数据");
        }
        //获取头部,取最后一次解析的列头数据
        Map<Integer, String> excelHeadIdxNameMap = headList.get(headList.size() - 1);
        //封装数据体
        List<Map<String, String>> excelDataList = Lists.newArrayList();
        for (Map<Integer, String> dataRow : dataList) {
            Map<String, String> rowData = new LinkedHashMap<>();
            excelHeadIdxNameMap.forEach((key, value) -> rowData.put(value, dataRow.get(key)));
            excelDataList.add(rowData);
        }
        return excelDataList;
    }

}
List<Map<String, String>> dataList = DynamicEasyExcelImportUtil.parseExcelToView(file.getBytes(), 1);

文章作者: YoonaDa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YoonaDa !
  目录