文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用 Spring Boot + EasyExcel 实现百万级数据导入导出功能开发

2024-11-29 20:01

关注

EasyExcel 框架及特性介绍

EasyExcel 是一个基于 Java 的 Excel 处理框架,具有以下显著特性:

  1. 内存优化:能够高效处理大文件,避免内存溢出问题,尤其在处理百万级数据时表现出色。
  2. 简单易用:提供了简洁直观的 API,使开发人员可以轻松地进行 Excel 文件的读取、写入和处理操作。
  3. 性能卓越:在数据处理速度方面具有优势,能够快速完成大规模数据的操作。
  4. 支持多种格式:不仅可以处理常见的 Excel 格式,还能适应不同的需求。

项目创建及依赖配置(pom.xml)



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        3.3.0
         
    
    com.icoderoad
    easyexcel-demo
    0.0.1-SNAPSHOT
    EasyExcel Demo

    
        17
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            com.alibaba
            easyexcel
            3.3.0
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

项目文件结构:

project-root/
    src/
        main/
            java/
                com/
                    icoderoad/
                        Application.java  // Spring Boot 启动类
                        controller/ExcelController  // 控制器类
                        service/ExcelService.java  // 服务类
                        config/EasyExcelConfig.java
            resources/
                application.yaml  // 配置文件
                static/index.html  // 静态资源,如 CSS、JS、图片等
 
    pom.xml  // Maven 项目配置文件

配置文件(application.yml)

# 在此处可添加您的应用特定配置
easyexcel:
	# 例如,设置最大读取行数
  max-read-rows: 1000000
  # 大文件处理配置
  large-file:
    # 启用大文件处理
    enabled: true
    # 内存缓冲区大小(字节)
    buffer-size: 10485760 
    # 每次读取的行数
    read-rows-per-time: 10000

启动类 Application.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

配置类 EasyExcelConfig.java

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.event.AnalysisEventListener;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.yaml.snakeyaml.Yaml;


@Configuration
public class EasyExcelConfig {

    @Value("${excel.read.maxRows}")
    private int maxRows;

    @Value("${excel.read.useDefaultListener}")
    private boolean useDefaultListener;

    @Value("${excel.read.readCacheSize}")
    private int readCacheSize;

    
    @Bean
    public AnalysisEventListener excelEventListener() {
        return new ExcelListener();
    }

    
    @Bean
    public EasyExcel easyExcel() {
        return new EasyExcel();
    }

    
    @Bean
    public ReadExcelProperties readExcelProperties() {
        ReadExcelProperties properties = new ReadExcelProperties();
        properties.setMaxRows(maxRows);
        properties.setUseDefaultListener(useDefaultListener);
        properties.setReadCacheSize(readCacheSize);
        return properties;
    }

}

服务接口定义及实现 ExcelService.java

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import org.springframework.stereotype.Service;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

@Service
public class ExcelService {

    // 示例方法
    public void exportData() {
        // 创建数据列表
        List> data = new ArrayList<>();
        for (int i = 0; i < 1000000; i++) {
            List row = new ArrayList<>();
            row.add("Row " + i);
            row.add("Column 1");
            row.add("Column 2");
            data.add(row);
        }

        // 创建输出流
        OutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream("exported_data.xlsx");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 创建 ExcelWriter
        ExcelWriter excelWriter = EasyExcel.write(outputStream)
            .withTemplate("template.xlsx")
            .build();

        // 创建 WriteSheet
        WriteSheet writeSheet = EasyExcel.writerSheet()
            .sheetName("Sheet1")
            .build();

        // 填充数据
        excelWriter.fill(data, new FillConfig());

        // 关闭 ExcelWriter
        excelWriter.finish();

        // 关闭输出流
        try {
        if (outputStream!= null) {
            outputStream.close();
        }
    }

    public void importData() {
        EasyExcel.read("imported_data.xlsx", new ExcelListener()).sheet().doRead();
    }

    // 自定义监听器,用于处理导入的数据
    static class ExcelListener extends AnalysisEventListener {

       private List> data = new ArrayList<>();

      @Override
      public void invoke(Object object, AnalysisContext context) {
          if (object instanceof List) {
              List rowData = (List) object;
              data.add(rowData);
          }
      }

      @Override
      public void doAfterAllAnalysed(AnalysisContext context) {
          // 在此处添加导入完成后的其他处理逻辑,例如数据校验、数据存储等
          System.out.println("数据导入完成,共 " + data.size() + " 行数据。");
      }
    }
}

控制器类 ExcelController.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ExcelController {

    @Autowired
    private ExcelService excelService;

    @GetMapping("/export")
    public String exportData() {
        excelService.exportData();
        return "数据导出成功";
    }

    @GetMapping("/import")
    public String importData() {
        excelService.importData();
        return "数据导入成功";
    }
}

前端页面 index.html




    
    Excel 操作


    
    
    

    

在实际开发中,大家需要根据具体的业务需求对数据的处理逻辑进行进一步的优化和完善。同时,还需要考虑异常处理、数据校验等方面,以确保系统的稳定性和可靠性。希望本文能够帮助大家成功实现百万级数据的导入导出功能,为大家的业务提供有力的支持。

来源:路条编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯