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

yizhihongxing

下面我将为您详细讲解如何使用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日

相关文章

  • Spring框架核心概念小结

    下面是Spring框架核心概念的完整攻略: Spring框架核心概念小结 1. IoC容器 IoC全称Inversion of Control,中文名为控制反转。在Spring框架中,IoC容器负责管理Java对象的创建和销毁,并且通过依赖注入的方式将对象之间的依赖关系交给容器来管理。Spring框架的IoC容器实现了Bean的管理,也就是管理对象实例,并提…

    Java 2023年5月19日
    00
  • Java文件快速copy复制实例代码

    下面是关于Java文件快速copy复制的攻略: 1. 环境准备 在进行Java文件快速copy复制之前,我们需要准备好相应的环境,包括Java开发工具、Java文件读写等。 安装Java开发工具:Eclipse、IDEA、NetBeans等,选择一款自己熟悉的Java开发工具即可。 引入Apache Commons IO包:可以通过项目管理工具Maven、G…

    Java 2023年5月20日
    00
  • js获取客户端网卡的IP地址、MAC地址

    获取客户端网卡的IP地址和MAC地址涉及到两个不同的技术点,分别是使用JavaScript获取客户端IP地址和使用Java Applet获取网卡的MAC地址。 使用JavaScript获取客户端IP地址 在JavaScript中,可以通过window.RTCPeerConnection对象来获取客户端的IP地址,具体过程如下: // 定义一个全局变量,用来存…

    Java 2023年6月15日
    00
  • java实现归并排序算法

    下面是详细讲解 “Java实现归并排序算法” 的完整攻略。 归并排序算法简介 归并排序是一种分治算法,先将待排序的序列拆分成若干个子序列,然后将每个子序列分别排序,最后将已经排序好的子序列合并成完整的排序结果。 归并排序的时间复杂度为O(nlogn),也是一种稳定排序算法。 Java实现归并排序 算法思路: 归并排序算法的主要思路为:将待排序序列细分到每个元…

    Java 2023年5月19日
    00
  • Spring简明分析Bean作用域

    针对“Spring简明分析Bean作用域”的问题,我给您提供以下完整攻略: 一、什么是Spring Bean作用域 Spring Bean的作用域是指在Spring容器中实例化一个bean对象时它的使用范围,即该bean对象在Spring容器中的生命周期中存在的范围。 Spring支持五种作用域: singleton(默认作用域) prototype req…

    Java 2023年5月31日
    00
  • Java中将String类型依照某个字符分割成数组的方法

    Java 中将 String 类型按照某个字符分割成数组的方法比较简单,主要通过 String 类中的 split() 方法实现。下面是详细的攻略: 1. String 类中的 split() 方法 split() 方法能够将 String 类型的字符串根据指定字符进行拆分成一个数组,具体语法如下: public String[] split(String …

    Java 2023年5月27日
    00
  • Spring Security全新版本使用方式

    下面是“Spring Security全新版本使用方式”的完整攻略。 一、什么是Spring Security? Spring Security是一个开源的安全框架,为Spring应用提供了一组安全服务,用于Web应用程序和服务保护。它提供了身份验证和授权,防止攻击,保护数据等一系列安全功能。因此Spring Security成为了Java领域中常用的安全框…

    Java 2023年6月3日
    00
  • Java日期操作方法工具类实例【包含日期比较大小,相加减,判断,验证,获取年份等】

    下面是详细讲解Java日期操作方法工具类实例的完整攻略。 一、概述 Java中日期操作是常见的需求,在很多场景中都需要对日期进行操作。Java日期操作方法工具类是为了方便Java开发者对日期进行操作而开发的一个工具类。该工具类提供了丰富的日期操作方法,包括比较大小、相加减、判断、验证、获取年份等。 二、使用方法 1. 引入工具类 首先,我们需要引入该工具类。…

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