使用Springboot+poi上传并处理百万级数据EXCEL

下面我将为您详细讲解如何使用Springboot+poi上传并处理百万级数据EXCEL的完整攻略。

1. 准备工作

在使用Springboot+poi上传并处理百万级数据EXCEL前,需要先完成以下准备工作:

  1. 确保已经安装好了Java环境,建议使用JDK 1.8及以上版本;
  2. 确保已经安装好了Maven,可以通过Maven来管理项目依赖;
  3. 需要引入Springboot和poi相关依赖,可以在pom.xml文件中配置。

引入依赖后,可以通过以下方式创建Springboot项目:

mvn archetype:generate -DgroupId=com.demo -DartifactId=excel -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

2. 实现上传和处理百万级数据Excel

2.1 实现上传Excel

首先需要在Controller中实现上传Excel的接口,代码如下:

@RestController
public class ExcelController {
    @PostMapping("/upload")
    public String uploadExcel(@RequestParam("file") MultipartFile file) {
        // 处理上传的Excel文件
        return "上传成功";
    }
}

需要注意的是,这里需要引入MultipartFile类来接收上传的Excel文件。

2.2 解析Excel数据

对于Excel文件的解析,可以使用Apache POI库。通过POI库可以轻松读取Excel文件,并将其中的数据转换为Java对象。

以下是解析Excel数据的代码示例:

public List<Student> readExcel(MultipartFile file) {
    List<Student> studentList = new ArrayList<>();
    try {
        Workbook workbook = WorkbookFactory.create(file.getInputStream());
        Sheet sheet = workbook.getSheetAt(0);
        int rowStart = sheet.getFirstRowNum() + 1;
        int rowEnd = sheet.getLastRowNum();
        for (int rowNum = rowStart; rowNum <= rowEnd; rowNum++) {
            Row row = sheet.getRow(rowNum);
            if (row == null) {
                continue;
            }
            Student student = new Student();
            student.setName(row.getCell(0).getStringCellValue());
            student.setAge((int) row.getCell(1).getNumericCellValue());
            student.setGender(row.getCell(2).getStringCellValue());
            studentList.add(student);
        }
        workbook.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return studentList;
}

其中,Student是一个简单的Java对象,用于表示Excel中的一行数据。

2.3 批量插入数据库

最后,需要将解析出的数据批量插入到数据库中。这里可以使用Mybatis-Plus来实现插入操作。

以下是批量插入数据的代码示例:

public void insertStudentList(List<Student> studentList) {
    try {
        studentMapper.insertBatch(studentList);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

在这里,需要将studentMapper替换为自己项目中的Mapper。

2.4 完整代码示例

总的代码示例如下:

@RestController
public class ExcelController {

    private final StudentMapper studentMapper;

    public ExcelController(StudentMapper studentMapper) {
        this.studentMapper = studentMapper;
    }

    @PostMapping("/upload")
    public String uploadExcel(@RequestParam("file") MultipartFile file) {
        List<Student> studentList = readExcel(file);
        insertStudentList(studentList);
        return "上传并处理成功";
    }

    private List<Student> readExcel(MultipartFile file) {
        List<Student> studentList = new ArrayList<>();
        try {
            Workbook workbook = WorkbookFactory.create(file.getInputStream());
            Sheet sheet = workbook.getSheetAt(0);
            int rowStart = sheet.getFirstRowNum() + 1;
            int rowEnd = sheet.getLastRowNum();
            for (int rowNum = rowStart; rowNum <= rowEnd; rowNum++) {
                Row row = sheet.getRow(rowNum);
                if (row == null) {
                    continue;
                }
                Student student = new Student();
                student.setName(row.getCell(0).getStringCellValue());
                student.setAge((int) row.getCell(1).getNumericCellValue());
                student.setGender(row.getCell(2).getStringCellValue());
                studentList.add(student);
            }
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return studentList;
    }

    private void insertStudentList(List<Student> studentList) {
        try {
            studentMapper.insertBatch(studentList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 示例说明

3.1 单文件上传示例

在前端页面上添加一个文件上传组件,并将文件上传至后台的Springboot应用,Springboot应用会自动解析Excel数据并插入到数据库中。

前端代码示例:

<form method="post" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <button type="submit">上传</button>
</form>

3.2 批量上传示例

可以通过定时任务或扫描指定目录的方式,批量上传多个Excel文件。通过使用ThreadPoolExecutor等线程池技术,可以同时处理多个上传文件。

以下是批量上传示例的代码:

@Scheduled(cron = "0 0 1 * * ?")
public void uploadExcelTask() {
    // 获取待上传文件列表
    List<File> fileList = getFileList();
    // 定义线程池处理上传任务
    ExecutorService executor = Executors.newFixedThreadPool(fileList.size());
    for (File file : fileList) {
        executor.submit(() -> {
            try {
                uploadExcel(file);
                // 处理成功后删除文件
                file.delete();
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
    // 关闭线程池
    executor.shutdown();
}

private List<File> getFileList() {
    List<File> fileList = new ArrayList<>();
    // 获取待上传文件夹路径
    String folderPath = "D:/upload";
    File folder = new File(folderPath);
    if (folder.exists() && folder.isDirectory()) {
        File[] files = folder.listFiles();
        if (files != null) {
            fileList = Arrays.asList(files);
        }
    }
    return fileList;
}

private void uploadExcel(File file) {
    try {
        FileInputStream inputStream = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile(file.getName(), inputStream);
        List<Student> studentList = readExcel(multipartFile);
        insertStudentList(studentList);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

在这里,getFileList方法是用来获取待上传的Excel文件列表,uploadExcel方法是用来处理单个Excel文件的上传和插入操作,uploadExcelTask方法则是用来批量上传和插入多个Excel文件。

至此,使用Springboot+poi上传并处理百万级数据Excel的完整攻略就介绍完毕了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Springboot+poi上传并处理百万级数据EXCEL - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Java多线程atomic包介绍及使用方法

    下面是详细讲解“Java多线程atomic包介绍及使用方法”的完整攻略。 什么是Java多线程atomic包? Java多线程中的atomic包是提供原子性操作的一个工具包。所谓原子性操作,是指一个操作在执行时不会被其他线程的操作所干扰,不会出现数据不一致或者执行结果不完整的情况。atomic包中的类都是安全的,可以保证在多线程的环境下进行数据操作时不会造成…

    Java 2023年5月26日
    00
  • Java实现快速生成词云图的示例代码

    下面就是Java实现快速生成词云图的完整攻略: 1. 了解词云图生成原理 在实现快速生成词云图的过程中,需要先了解一下词云图的生成原理。简单来说,词云图是根据一些文字词频数据,将词频高的词语以较大的字体显示,而词频低的词语则以较小的字体显示,最终形成一个类似云朵的图形。 2. 寻找、引入合适的java词云图生成库 在实现过程中,需要找到一个合适的java词云…

    Java 2023年5月19日
    00
  • Java实现经典拳皇误闯冒险岛游戏的示例代码

    让我来详细给你讲解Java实现经典拳皇误闯冒险岛游戏的示例代码的完整攻略。 核心思路 经典拳皇误闯冒险岛游戏的核心思路是将两个游戏融合在一起,使得玩家能够在游戏中既能享受打拳皇的快感,又能够领略冒险岛的神奇之旅。在实现这个目标的过程中,需要分别实现拳皇游戏和冒险岛游戏的核心逻辑,并将它们合并在一起。 实现步骤 首先,我们需要将拳皇游戏的代码和冒险岛游戏的代码…

    Java 2023年5月23日
    00
  • Spring Security密码解析器PasswordEncoder自定义登录逻辑

    概述: Spring Security 的 PasswordEncoder 用于对用户的密码进行加密(哈希处理)和解密,提供了很多加密算法,但是在某些情况下,我们需要自定义一些特殊的登录逻辑。本文将详细介绍如何自定义登录逻辑,实现 PasswordEncoder 的自定义。 过程: 1.继承PasswordEncoder接口,实现自定义逻辑的加密方法。 pu…

    Java 2023年6月3日
    00
  • sublime text 3 快捷键大全以及配置编译环境

    Sublime Text 3 快捷键大全以及配置编译环境 Sublime Text 3 是一款功能强大的文本编辑器,可以帮助开发者提高工作效率。在本文中,我们将讲解 Sublime Text 3 的快捷键大全以及如何配置编译环境。 Sublime Text 3 快捷键大全 Sublime Text 3 支持各种快捷键操作,以下是一些常用快捷键列表。 快捷键 …

    Java 2023年5月26日
    00
  • 使用Maven搭建Hadoop开发环境

    下面我将介绍如何使用Maven搭建一个Hadoop开发环境: 1. 简介 Maven是一个Java项目管理工具,用于项目构建、依赖管理和项目信息维护。在Hadoop项目中,Maven能够方便地添加和管理Hadoop相关的依赖项,例如Hadoop Client API、Hadoop HDFS API、YARN API和MapReduce API。因此,使用Ma…

    Java 2023年5月20日
    00
  • Linux 下java jps命令使用解析详解

    Linux 下 java jps 命令使用解析详解 Java 程序在运行的时候,如果需要查看当前 Java 进程,可以使用 jps 命令。本文通过详细介绍各个参数以及示例,帮助用户更好地使用 jps 命令。 为什么要使用 jps 命令 jps 命令用于查看当前 Java 进程的进程 ID (PID) 以及启动类的类名 (fully qualified nam…

    Java 2023年5月26日
    00
  • SpringBoot在项目中访问静态资源步骤分析

    Spring Boot在项目中访问静态资源步骤分析 在Spring Boot应用程序中,我们经常需要访问静态资源,如图片、CSS、JavaScript等。为了实现这些功能,我们需要在Spring Boot应用程序中配置静态资源的访问路径。在本文中,我们将详细介绍如何在Spring Boot应用程序中访问静态资源,并提供两个示例说明。 步骤分析 在Spring…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部