在Spring Boot应用程序中,处理Excel文件并将其数据导入MySQL数据库,可以使用Apache POI库来读取Excel文件,并使用Spring Data JPA或MyBatis等ORM框架来处理数据库操作。

一、添加依赖

<dependencies>
    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- MySQL Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.16</version>
    </dependency>

    <!-- Apache POI for Excel handling -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>

    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

二、配置数据库连接

application.propertiesapplication.yml中配置数据库连接

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/your_database?characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: your_username
    password: your_password
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

三、实体类

定义一个实体类User,对应数据库中的表:

import javax.persistence.*;

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String email;

    // Getters and setters
}

注:实体类必须有@Entity和@id注解

四、Repository接口

创建一个JPA Repository接口来处理数据库操作:

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}

五、服务类

创建一个服务类来处理业务逻辑,包括读取Excel文件和保存数据到数据库:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@Service
public class ExcelService {

    @Autowired
    private UserRepository userRepository;

    public void saveExcelData(MultipartFile file) throws IOException {
        try (InputStream inputStream = file.getInputStream();
             Workbook workbook = new XSSFWorkbook(inputStream)) {

            // 获取第一个Sheet
            Sheet sheet = workbook.getSheetAt(0);
            Iterator<Row> rowIterator = sheet.iterator();

            // 跳过表头
            if (rowIterator.hasNext()) {
                rowIterator.next();
            }

            // 用于存储所有用户数据
            List<User> users = new ArrayList<>();

            // 遍历每一行
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                User user = new User();

                // 假设Excel表格的列顺序为:姓名、邮箱
                user.setName(getCellValueAsString(row.getCell(0)));
                user.setEmail(getCellValueAsString(row.getCell(1)));

                users.add(user);
            }

            // 批量保存到数据库
            userRepository.saveAll(users);
        }
    }

    // 辅助方法:获取单元格的值并转换为字符串
    private String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue().toString();
                } else {
                    return String.valueOf(cell.getNumericCellValue());
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            default:
                return "";
        }
    }
}

六、控制器

创建一个控制器来处理文件上传请求:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@RestController
public class ExcelController {

    @Autowired
    private ExcelService excelService;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "Please select a file to upload.";
        }

        try {
            excelService.saveExcelData(file);
            return "File uploaded and data saved successfully.";
        } catch (IOException e) {
            e.printStackTrace();
            return "Failed to upload file: " + e.getMessage();
        }
    }
}

七、运行并测试应用程序

可以在IDE中运行Spring Boot应用程序,并使用POST请求将Excel文件上传到/upload端点。例如,使用Postman、Apifox或curl:

例如:Excel表格内容如下:

姓名 邮箱
111@qq.com
222@qq.com
333@qq.com

1、使用Postman或者Apifox

  1. 选择POST请求。
  2. URL为:http://localhost:8080/upload
  3. Body选项卡中,选择form-data
  4. 添加一个键file,类型选择File,然后选择要上传的Excel文件。
  5. 点击Send按钮。

2、使用curl:

curl -X POST -H "Content-Type: multipart/form-data" -F "file=@path_to_your_file.xlsx" http://localhost:8080/upload

注意:

  1. 大文件处理

    • 如果Excel文件非常大,建议使用流式处理,避免一次性加载整个文件到内存中。
  2. 批量插入优化

    • 使用saveAll方法可以批量插入数据,但仍需注意数据库的性能限制。

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐