使用Java Spring MVC异步导入Excel文件的完整指南

在现代Web应用程序中,导入数据的功能越发显得重要。尤其是Excel文件作为数据传输的标准格式,许多企业应用场景都需要实现Excel文件的导入功能。本文将介绍如何使用Java Spring MVC实现异步导入Excel文件,并附带代码示例,帮助您快速上手。

1. 项目结构

在开始之前,我们需要一个基础的Spring MVC项目。项目结构如下:

/src
    /main
        /java
            /com
                /example
                    /controller
                        ExcelController.java
                    /service
                        ExcelService.java
                    /model
                        DataModel.java
        /resources
            application.properties
        /webapp
            /WEB-INF
                /views
                    import.html

2. 依赖配置

在项目中使用Apache POI库来处理Excel文件,可以在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.0.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3. 创建数据模型

我们将创建一个简单的数据模型来表示Excel中的数据。例如,一个用户数据模型:

package com.example.model;

public class DataModel {
    private String name;
    private int age;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

4. 创建服务层

接下来,我们需要创建一个服务层来处理Excel文件的解析:

package com.example.service;

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

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

@Service
public class ExcelService {
    public List<DataModel> readExcel(MultipartFile file) throws IOException {
        List<DataModel> dataModels = new ArrayList<>();
        
        try (Workbook workbook = new XSSFWorkbook(file.getInputStream())) {
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
            for (Row row : sheet) {
                DataModel dataModel = new DataModel();
                dataModel.setName(row.getCell(0).getStringCellValue()); // 假设姓名在第一列
                dataModel.setAge((int) row.getCell(1).getNumericCellValue()); // 假设年龄在第二列
                dataModels.add(dataModel);
            }
        }
        
        return dataModels;
    }
}

5. 创建控制器

现在我们需要一个控制器来处理文件上传请求,并异步处理Excel导入:

package com.example.controller;

import com.example.model.DataModel;
import com.example.service.ExcelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.concurrent.CompletableFuture;

@RestController
@RequestMapping("/api/excel")
public class ExcelController {

    @Autowired
    private ExcelService excelService;

    @PostMapping("/import")
    public CompletableFuture<List<DataModel>> importExcel(@RequestParam("file") MultipartFile file) {
        return CompletableFuture.supplyAsync(() -> {
            try {
                return excelService.readExcel(file);
            } catch (IOException e) {
                throw new RuntimeException("导入失败");
            }
        });
    }
}

6. 前端页面

在用户上传Excel文件时,我们可以使用一个简单的前端页面:

<!DOCTYPE html>
<html>
<head>
    <title>Excel Import</title>
    <script>
        async function uploadFile() {
            const fileInput = document.getElementById('fileInput');
            const formData = new FormData();
            formData.append("file", fileInput.files[0]);
            
            const response = await fetch('/api/excel/import', {
                method: 'POST',
                body: formData
            });
            
            const result = await response.json();
            console.log('导入结果:', result);
        }
    </script>
</head>
<body>
    导入Excel文件
    <input type="file" id="fileInput" />
    <button onclick="uploadFile()">上传</button>
</body>
</html>

7. 绘制数据饼状图

为了可视化导入的数据,我们可以使用以下mermaid语法生成一个简单的饼状图:

pie
    title 用户年龄分布
    "18-25": 10
    "26-35": 20
    "36-45": 15
    "46-60": 5

结尾

通过以上步骤,我们已经实现了一个使用Java Spring MVC异步导入Excel文件的简洁示例。该示例展示了如何接收文件、解析Excel内容,并异步处理数据。此外,您还可以通过扩展服务层,以满足您的特定需求。如有更复杂的逻辑需求,建议使用数据库存储和更复杂的报表功能,来增强整个系统的能力。希望这个示例能够对您有所帮助,激励您在项目中实现更强大的数据导入和处理功能!