使用Apache POI和SpringBoot实现Excel文件上传和解析功能

 更新时间:2025年01月08日 08:52:58   作者:Kwan的解忧杂货铺  
在现代企业应用开发中,数据的导入和导出是一项常见且重要的功能需求,Excel 作为一种广泛使用的电子表格工具,常常被用来存储和展示数据,下面我们来看看如何使用Apache POI和SpringBoot实现Excel文件上传和解析功能吧

在现代企业应用开发中,数据的导入和导出是一项常见且重要的功能需求。Excel 作为一种广泛使用的电子表格工具,因其直观、易用的特性,常常被用来存储和展示数据。因此,实现 Excel 文件的上传和解析功能,能够方便地将外部数据导入到系统中,对于提高工作效率、实现数据共享具有重要意义。

一、技术选型与环境搭建

Apache POI 库简介

Apache POI 是一个开源的 Java 库,用于处理 Microsoft Office 文档。它提供了对 Excel 文件的读写支持,能够处理 Excel 97-2003(.xls)和 Excel 2007+(.xlsx)两种格式。POI 通过提供丰富的 API,使得开发者能够方便地操作 Excel 文件中的单元格、行、列、工作表等元素,实现数据的读取、写入、格式化等功能。

Spring Boot 框架简介

Spring Boot 是一个基于 Spring 框架的项目,旨在简化 Spring 应用的开发过程。它通过提供一系列的“Starters”依赖管理和自动配置功能,使得开发者能够快速搭建起一个 Spring 应用。Spring Boot 还内置了 Tomcat 容器,无需部署 WAR 包,可以直接运行 Spring 应用,极大地简化了部署流程。此外,Spring Boot 还支持 RESTful API 的开发,通过注解的方式能够轻松实现数据的接收和响应。

环境搭建

开发工具:推荐使用 IntelliJ IDEA 或 Eclipse 等主流的 Java 开发工具,它们提供了丰富的插件支持和便捷的代码提示功能,有助于提高开发效率。

JDK 版本:需要安装 JDK 1.8 或更高版本,因为 Spring Boot 和 Apache POI 都依赖于 Java 8 及以上版本的新特性。

依赖管理:使用 Maven 或 Gradle 作为项目的依赖管理工具。在项目的pom.xml文件中引入 Apache POI 和 Spring Boot 相关的依赖。

<!-- Apache POI依赖 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>
<!-- Spring Boot Web依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.7.5</version>
</dependency>
<!-- Spring Boot文件上传依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.7.5</version>
</dependency>

项目结构:创建一个 Spring Boot 项目,并在项目中创建相应的包结构,如controller、service、model等,用于存放控制器、服务层代码和数据模型等。

二、Excel 文件上传接口实现

创建控制器

在 Spring Boot 项目中创建一个控制器类ExcelController,用于处理 Excel 文件的上传请求。使用@RestController注解来定义控制器,表示该控制器中的所有方法都会返回 JSON 格式的数据。

@RestController
public class ExcelController {
    // 文件上传接口
    @PostMapping("/upload")
    public Result upload(@RequestParam("file") MultipartFile file) {
        // 文件上传处理逻辑
    }
}

在upload方法中,使用@PostMapping注解来指定请求的 URL 路径为/upload,并使用@RequestParam注解来接收前端上传的文件。MultipartFile是 Spring 提供的一个接口,用于表示上传的文件。

文件读取与解析

在upload方法中,首先获取上传文件的输入流,然后使用 Apache POI 库来读取和解析 Excel 文件。

try (InputStream inputStream = file.getInputStream()) {
    Workbook workbook = WorkbookFactory.create(inputStream); // 使用WorkbookFactory来自动处理不同格式的Excel文件
    Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
    // 解析Excel数据的逻辑
}

WorkbookFactory.create(inputStream)方法会根据输入流中的文件格式自动创建相应的Workbook对象,无论是.xls还是.xlsx格式的 Excel 文件都能被正确处理。workbook.getSheetAt(0)方法用于获取 Excel 文件中的第一个工作表。

数据解析与存储

在获取到工作表后,可以遍历工作表中的每一行和每一列,将数据解析出来并存储到合适的数据结构中。通常情况下,第一行是列名,从第二行开始是实际的数据。

List<Map<String, String>> data = new ArrayList<>();
Row headerRow = sheet.getRow(0); // 获取第一行作为列名
String[] headers = new String[3];
for (int i = 0; i < 3; i++) {
    headers[i] = headerRow.getCell(i).getStringCellValue();
}
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
    Row row = sheet.getRow(i);
    Map<String, String> rowData = new HashMap<>();
    for (int j = 0; j < 3; j++) {
        Cell cell = row.getCell(j);
        String cellValue = "";
        if (cell != null) {
            switch (cell.getCellType()) {
                case STRING:
                    cellValue = cell.getStringCellValue();
                    break;
                case NUMERIC:
                    if (DateUtil.isCellDateFormatted(cell)) {
                        cellValue = cell.getDateCellValue().toString();
                    } else {
                        cellValue = String.format("%.0f", cell.getNumericCellValue());
                    }
                    break;
                case BOOLEAN:
                    cellValue = String.valueOf(cell.getBooleanCellValue());
                    break;
                case FORMULA:
                    cellValue = cell.getCellFormula();
                    break;
                default:
                    cellValue = "";
            }
        }
        rowData.put(headers[j], cellValue);
    }
    data.add(rowData);
}

在上述代码中,首先读取第一行的列名,并存储到headers数组中。然后从第二行开始遍历每一行的数据,对于每个单元格,根据其类型(字符串、数值、日期、布尔值、公式等)进行相应的处理,并将解析出的数据存储到rowData这个Map中,其中键为列名,值为单元格的值。最后将每一行的数据rowData添加到data这个列表中。

数据处理与响应

在解析完 Excel 文件中的数据后,可以根据实际需求对数据进行进一步的处理,例如存储到数据库中。在本示例中,仅简单地将解析出的数据打印到控制台,并返回一个结果对象表示操作是否成功。

System.out.println("读取到的数据: " + data);
return Result.ok("导入excel完成");

如果在处理过程中发生异常,则捕获异常并返回错误结果。

} catch (Exception e) {
    e.printStackTrace();
    return Result.error("导入excel失败");
}

三、前端页面实现

创建 HTML 页面

在 Spring Boot 项目的src/main/resources/static目录下创建一个 HTML 页面,用于实现文件上传的功能。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Excel文件上传</title>
  </head>
  <body>
    <h1>Excel文件上传</h1>
    <form id="uploadForm" enctype="multipart/form-data">
      <input type="file" id="file" name="file" accept=".xls,.xlsx" />
      <button type="button" onclick="uploadFile()">上传</button>
    </form>
    <script>
      function uploadFile() {
        var formData = new FormData(document.getElementById("uploadForm"));
        fetch("/upload", {
          method: "POST",
          body: formData,
        })
          .then((response) => response.json())
          .then((data) => {
            if (data.status === "ok") {
              alert("文件上传成功!");
            } else {
              alert("文件上传失败:" + data.message);
            }
          })
          .catch((error) => {
            console.error("上传失败:", error);
          });
      }
    </script>
  </body>
</html>

在 HTML 页面中,创建一个表单uploadForm,其中包含一个文件输入框file和一个上传按钮。文件输入框的accept属性设置为.xls,.xlsx,表示只允许选择 Excel 文件。点击上传按钮时,会调用uploadFile函数,该函数使用 JavaScript 的FormData对象来构建表单数据,并通过fetch API 发送 POST 请求到后端的/upload接口。

以上就是使用Apache POI和SpringBoot实现Excel文件上传和解析功能的详细内容,更多关于SpringBoot Apache POI上传和解析Excel的资料请关注脚本之家其它相关文章!

相关文章

  • Java二维数组与动态数组ArrayList类详解

    Java二维数组与动态数组ArrayList类详解

    这篇文章主要给大家介绍了关于Java二维数组与动态数组ArrayList类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 浅谈SpringBoot集成Redis实现缓存处理(Spring AOP实现)

    浅谈SpringBoot集成Redis实现缓存处理(Spring AOP实现)

    这篇文章主要介绍了浅谈SpringBoot集成Redis实现缓存处理(Spring AOP实现),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 关于Spring总结(必看篇)

    关于Spring总结(必看篇)

    下面小编就为大家带来一篇关于Spring总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • SpringBoot项目引入第三方sdk jar包的解决方案

    SpringBoot项目引入第三方sdk jar包的解决方案

    这篇文章主要介绍了SpringBoot项目引入第三方sdk jar包,个人感觉比较好的解决方案是将 jar上传到本地的maven仓库,然后通过pom依赖,引入第三方jar包,需要的朋友可以参考下
    2022-05-05
  • Java抽象类、继承及多态和适配器的实现代码

    Java抽象类、继承及多态和适配器的实现代码

    这篇文章主要介绍了Java抽象类、继承及多态和适配器的实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-06-06
  • Java Redis配置Redisson的方法详解

    Java Redis配置Redisson的方法详解

    这篇文章主要为大家详细介绍了Java Redis配置Redisson的相关资料,文中的示例代码讲解详细,对我们学习或工作有一定参考价值,感兴趣的可以了解一下
    2022-08-08
  • java程序代码与文本对比实用工具简介

    java程序代码与文本对比实用工具简介

    可以对两段文本进行对比,检测/比较两个文本有什么不同的差异,以便修改,常用于程序代码,就是不需要人工查看,尤其是大文件,有几百上千行的代码,这时候就建议使用比较工具了,不用浪费过多时间去寻找
    2021-09-09
  • 详解Vue响应式的部分实现

    详解Vue响应式的部分实现

    响应式,简单来说当数据发生变化时,对数据有依赖的代码会重新执行。这篇文章主要为大家介绍了Vue中响应式的部分实现,感兴趣的可以了解一下
    2022-12-12
  • Hibernate中的多表查询及抓取策略

    Hibernate中的多表查询及抓取策略

    本文主要介绍了Hibernate中的多表查询及抓取策略,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java防锁屏小程序代码实例

    Java防锁屏小程序代码实例

    这篇文章主要介绍了Java防锁屏小程序代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09

最新评论