拉不拉稀肚拉稀 发表于 2024-5-13 02:39:20

java-Excel导入导出数据-方法

一、Excel导入导出的应用场景

1、数据导入

减轻录入工作量
2、数据导出

统计信息归档
3、数据传输

异构体系之间数据传输
二、EasyExcel简介

Java剖析、天生Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严峻的问题就是非常的耗内存,poi有一套SAX模式的API可以肯定水平的解决一些内存溢出的问题,但POI照旧有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存斲丧依然很大。
easyexcel重写了poi对07版Excel的剖析,一个3M的excel用POI sax剖析依然必要100M左右内存,改用easyexcel可以低落到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让利用者更加简单方便
1、网站


[*]官方网站:https://easyexcel.opensource.alibaba.com/
[*]github地点:https://github.com/alibaba/easyexcel
[*]gitee地点:https://gitee.com/easyexcel/easyexcel
2、EasyExcel特点


[*]Java领域剖析、天生Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严峻的问题就是非常的耗内存。如果你的体系并发量不大的话可能还行,但是一旦并发上来后肯定会OOM或者JVM频繁的full gc。
[*]EasyExcel是阿里巴巴开源的一个excel处置惩罚框架,以利用简单、节流内存著称。EasyExcel能大大减少占用内存的主要缘故原由是在剖析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个剖析。
[*]EasyExcel采用一行一行的剖析模式,并将一行的剖析结果以观察者的模式通知处置惩罚(AnalysisEventListener)。
四、在 spring-boot 应用

1、引入 pom.xml 依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
</dependency>2、建立 ExcelUtils 公共方法

@Slf4j
public class ExcelUtils {

    /**
   * 表格导出
   *
   * @param dataList数据列表
   * @param sheetName sheet页
   * @param fileName文件名
   * @param tClass    dataList 类型
   * @param response
   * @param <T>
   */
    public static <T> void excelExport(List<T> dataList, String sheetName, String fileName, Class<T> tClass, HttpServletResponse response) {
      try {

            response.setContentType("application/vnd.ms-excel");
            String contentDisposition = "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", StandardCharsets.UTF_8.toString());
            response.setHeader("Content-Disposition", contentDisposition);
            response.setHeader("fileName", URLEncoder.encode(fileName, "UTF-8"));
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition,fileName");

            // 使用 EasyExcel 构造 ExcelWriter
            final ExcelWriter writer = EasyExcelFactory.write(response.getOutputStream(), tClass).autoCloseStream(Boolean.FALSE).build();
            // 使用 EasyExcel 构造 WriteSheet
            final WriteSheet sheet = EasyExcelFactory.writerSheet(sheetName).build();
            writer.write(dataList, sheet);
            writer.finish();
      } catch (Exception e) {
            log.error("excelExport error", e);
            response.setHeader("content-Type", "application/json; charset=utf-8");
            response.setCharacterEncoding("utf-8");
            try {
                response.getWriter().println(JSONUtil.toJsonStr(Result.ofErrorT(ResultCodeEnum.SYSTEM_EXECUTION_ERROR.getCode(), ResultCodeEnum.SYSTEM_EXECUTION_ERROR.getMsg())));
            } catch (Exception ex) {
                log.error("response.getWriter() error", ex);
            }
      }
    }

    /**
   * @param file   文件数据
   * @param zClass   接收文件数据类
   * @param headRows 文件数据从哪一行开始
   * @return
   */
    public static <T> List<T> excelCopyEntities(MultipartFile file, Class<?> zClass, int headRows) throws IOException {

      List<T> list = new ArrayList<>();
      try {
            //配置第几行开始读取数据
            ImportParams params = new ImportParams();
            params.setHeadRows(headRows);

            list = ExcelImportUtil.importExcel(file.getInputStream(), zClass, params);
      } catch (Exception e) {
            e.printStackTrace();
      } finally {
            IOUtils.closeQuietly(file.getInputStream());
      }
      return list;

    }
}3、建立 导入导出 字段实体类

注:@ExcelProperty(value="", index="")
https://img2024.cnblogs.com/blog/2468225/202403/2468225-20240306003032137-2014358847.png
4、编写导入的伪代码

注:此导入不能导入过大的数据量(最好不要超过 mybatis-plus 的接受范围:5000,超过的话,必要在编写别的的读取excel方法,进行分批次导入)
https://img2024.cnblogs.com/blog/2468225/202403/2468225-20240306003356907-1409198676.png
5、编写导出的伪代码

https://img2024.cnblogs.com/blog/2468225/202403/2468225-20240306003318673-287406429.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: java-Excel导入导出数据-方法