SpringBoot中Excel表的导入、导出功能的实现

文章目录

  • 一、easyExcel简介
  • 二、Excel表的导出
    • 2.1 添加 Maven 依赖
    • 2.2 创建导出数据的实体类
    • 4. 编写导出接口
    • 5. 前端代码
    • 6. 实现效果
  • 三、excel表的导出
    • 1. Excel表导入的整体流程
      • 1.1 配置文件存储路径
    • 2. 前端实现
      • 2.1 文件上传组件
    • 2.2 文件上传逻辑
    • 3. 后端实现
      • 3.1 文件上传接口
    • 3.2 数据解析接口
    • 4. 实现效果

一、easyExcel简介

Excel表的导入导出有很多种方式,这里我们使用easyExel。EasyExcel 是阿里巴巴推出的一个处理 Excel 文件的库,特别适合大数据量的 Excel 文件操作,具有性能优越、内存占用小等特点。

二、Excel表的导出

集成 EasyExcel 到 Spring Boot 项目

2.1 添加 Maven 依赖

首先,在 pom.xml 中添加 EasyExcel 的依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.6</version> <!-- 版本号可以根据需要调整 -->
</dependency>

2.2 创建导出数据的实体类

根据需要创建实体类,使用@ExcelProperty注解标注实体类的字段,指定表头名称和列索引,EasyExcel 会根据这个类的字段和注解来生成 Excel 文件。

@Data
public class PersonVO {
    @ExcelProperty(value = "人员ID", index = 0)
    private Integer personId;

    @ExcelIgnore
    private Integer communityId;

    @ExcelProperty(value = "单元名称", index = 2)
    private String termName;

    @ExcelProperty(value = "房号", index = 3)
    private String houseNo;

    @ExcelProperty(value = "姓名", index = 4)
    private String userName;

    @ExcelProperty(value = "性别", index = 5)
    private String sex;

    @ExcelProperty(value = "手机号", index = 6)
    private String mobile;

    @ExcelIgnore
    private String faceUrl;

    @ExcelProperty(value = "居住性质", index = 7)
    private String personType;

    @ExcelIgnore
    private Integer state;

    @ExcelIgnore
    private String creater;

    @ExcelIgnore
    private Date createTime;

    @ExcelProperty(value = "备注", index = 8)
    private String remark;

    @ExcelProperty(value = "社区名称", index = 1)
    private String communityName;
}

不需要导出的列使用@ExcelIgnore忽略

4. 编写导出接口

@RestController
public class ExcelController {

    @GetMapping("/exportExcel")
    public Result exportExcel(PersonListForm personListForm){
    	//查询数据
       	PageVO pageVO = this.personService.personList(personListForm);
        List<PersonVO> list = pageVO.getList();

        // 设置文件路径和文件名
        String path = "D:/community/excel_export/";
        String fileName = path + "personInfo_" + System.currentTimeMillis() + ".xlsx";

        // 使用 EasyExcel 导出数据
        EasyExcel.write(fileName, PersonVO.class)
                .sheet("人员信息")
                .doWrite(list);  // 直接写入数据

        return Result.ok().put("data", fileName);
    }
}

5. 前端代码

//导出按钮
 <el-form-item>
          <el-button type="primary" icon="el-icon-download" @click="handleExcel">导出</el-button>
 </el-form-item>
 
handleExcel() {
	    this.$confirm('是否确认导出所有数据项?').then(() => {
	        exportExcel(this.listQuery).then(res => {
	            const fileUrl = process.env.VUE_APP_BASE_API + '/sys/person/exportExcel?fileName=' + res.data;
	            const link = document.createElement('a');
	            link.href = fileUrl;
	            link.download = res.data; // 下载文件的名称
	            link.click();
	        });
	    }).catch(() => {});
	}

6. 实现效果

在这里插入图片描述

三、excel表的导出

1. Excel表导入的整体流程

前端部分:

  • 用户通过上传组件选择Excel文件。
  • 文件上传到后端服务器。
  • 后端返回文件路径或标识符。
  • 前端调用解析接口,将文件路径传递给后端。
  • 后端解析Excel文件,将数据保存到数据库。
  • 返回解析结果给前端,提示用户成功或失败信息。

后端部分:

  • 提供文件上传接口,接收Excel文件并保存到服务器。
  • 提供解析接口,读取Excel文件内容并处理数据。
  • 将解析的数据保存到数据库。
  • 返回解析结果。

1.1 配置文件存储路径

确保文件存储路径是动态配置的,避免硬编码。可以在application.yml中配置文件存储路径:

upload:
  excel: D:/community/upload/excel/

在代码中读取配置:

@Value("${upload.excel}")
    private String excel;

2. 前端实现

2.1 文件上传组件

使用Element UI的el-upload组件实现文件上传功能。

<template>
  <el-dialog
    :title="'上传住户资料'"
    :close-on-click-modal="false"
    :visible.sync="visible"
    width="60%"
  >
    <el-form label-width="100px" style="width:95%;" @keyup.enter.native="dataFormSubmit()">
      <el-row>
        <el-col :span="24">
          <el-form-item label="导入住户资料">
            <el-upload
              class="avatar-uploader"
              :headers="headers"
              :action="uploadUrl"
              :show-file-list="false"
              :on-success="handleAvatarSuccess"
              name="uploadExcel"
              :before-upload="beforeAvatarUpload">
              <i class="el-icon-plus avatar-uploader-icon"></i>
            </el-upload>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="模板下载">
            <a :href="process.env.VUE_APP_BASE_API + '/community/upload/excel/personInfo.xls'" download>点击下载Excel模板</a>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <span style="color:red" v-html="errorInfo" />
        </el-col>
      </el-row>
    </el-form>
    <span slot="footer" class="dialog-footer">
      <el-button type="primary" @click="dataFormSubmit()">确 定</el-button>
    </span>
  </el-dialog>
</template>

2.2 文件上传逻辑

在beforeAvatarUpload方法中,限制文件类型和大小

beforeAvatarUpload(file) {
  this.errorInfo = '';
  const ext = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();
  const imgSize = file.size / 1024 / 1024 < 10;
  if (!['xls', 'xlsx'].includes(ext)) {
    this.$message.error('文件格式只能为xls或xlsx文件');
    return false;
  }
  if (!imgSize) {
    this.$message.error('文件大小不能超过10MB');
    return false;
  }
  return true;
}

在handleAvatarSuccess方法中,处理上传成功后的逻辑:

handleAvatarSuccess(response, file) {
  if (response && response.code === 200) {
    parsefile(response.data).then(res => {
      if (res && res.code === 200) {
        if (res.status === 'success') {
          this.errorInfo = res.data;
          this.$message.success('上传成功');
        } else {
          this.errorInfo = res.data;
          this.$message.error('上传失败');
        }
      } else {
        this.errorInfo = '解析文件失败';
        this.$message.error('解析文件失败');
      }
    }).catch(error => {
      console.error('解析文件失败', error);
      this.errorInfo = '解析文件失败';
      this.$message.error('解析文件失败');
    });
  } else {
    this.errorInfo = '文件上传失败';
    this.$message.error('文件上传失败');
  }
}

3. 后端实现

3.1 文件上传接口

接收上传的Excel文件,并保存到服务器的临时目录中:

@PostMapping("/excelUpload")
public Result excelUpload(@RequestParam("uploadExcel") MultipartFile file) throws Exception {
    if (file.getOriginalFilename().equals("")) {
        return Result.error("没有选中要上传的文件");
    } else {
        String picName = UUID.randomUUID().toString();
        String oriName = file.getOriginalFilename();
        String extName = oriName.substring(oriName.lastIndexOf("."));
        String newFileName = picName + extName;
        File targetFile = new File(excel, newFileName);
        // 保存文件
        file.transferTo(targetFile);
        return Result.ok().put("data", newFileName);
    }
}

3.2 数据解析接口

读取Excel文件内容,解析数据并保存到数据库:

@LogAnnotation("导入数据")
@PostMapping("/parsefile/{fileName}")
public Result parsefile(@PathVariable("fileName") String fileName, HttpSession session) {
    User user = (User) session.getAttribute("user");
    try {
        String basePath = excel + fileName;
        List<ExcelVo> dataList = EasyExcel.read(new File(basePath), ExcelVo.class).sheet().doReadSync();

        for (ExcelVo vo : dataList) {
            Person single = new Person();
            single.setPersonId(0);
            single.setState(1);
            single.setFaceUrl("");
            single.setCommunityId(vo.getCommunityId());
            single.setTermName(vo.getTermName());
            single.setHouseNo(vo.getHouseNo());
            single.setUserName(vo.getUserName());
            single.setSex(vo.getSex());
            single.setMobile(vo.getMobile());
            single.setPersonType(vo.getPersonType());
            single.setRemark(vo.getRemark());
            single.setCreater(user.getUsername());
            this.personService.save(single);
        }
        return Result.ok().put("status", "success").put("data", "数据导入完成!");
    } catch (Exception e) {
        e.printStackTrace();
        return Result.error().put("status", "fail").put("data", "解析文件失败:" + e.getMessage());
    }
}

4. 实现效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961285.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vim交换文件的工作原理

在vim中&#xff0c;交换文件是一个临时文件&#xff0c;当我们使用vim打开一个文件进行编辑&#xff08;一定得是做出了修改才会产生交换文件&#xff09;时候&#xff0c;vim就会自动创建一个交换文件&#xff0c;而之后我们对于文件的一系列修改都是在交换文件中进行的&…

C++/stack_queue

目录 1.stack 1.1stack的介绍 1.2stack的使用 练习题&#xff1a; 1.3stack的模拟实现 2.queue的介绍和使用 2.1queue的介绍 2.2queue的使用 2.3queue的模拟实现 3.priority_queue的介绍和使用 3.1priority_queue的介绍 3.2priority_queue的使用 欢迎 1.stack 1.1stack…

5分钟带你获取deepseek api并搭建简易问答应用

目录 1、获取api 2、获取base_url和chat_model 3、配置模型参数 方法一&#xff1a;终端中临时将加入 方法二&#xff1a;创建.env文件 4、 配置client 5、利用deepseek大模型实现简易问答 deepseek-v3是截止博文撰写之日&#xff0c;无论是国内还是国际上发布的大模型中…

机器学习day4

自定义数据集 使用pytorch框架实现逻辑回归并保存模型&#xff0c;然后保存模型后再加载模型进行预测 import numpy as np import torch import torch.nn as nn import torch.optim as optimizer import matplotlib.pyplot as pltclass1_points np.array([[2.1, 1.8],[1.9, 2…

58.界面参数传递给Command C#例子 WPF例子

界面参数的传递&#xff0c;界面参数是如何从前台传送到后台的。 param 参数是从界面传递到命令的。这个过程通常涉及以下几个步骤&#xff1a; 数据绑定&#xff1a;界面元素&#xff08;如按钮&#xff09;的 Command 属性绑定到视图模型中的 RelayCommand 实例。同时&#x…

Julius AI 人工智能数据分析工具介绍

Julius AI 是一款由 Casera Labs 开发的人工智能数据分析工具&#xff0c;旨在通过自然语言交互和强大的算法能力&#xff0c;帮助用户快速分析和可视化复杂数据。这款工具特别适合没有数据科学背景的用户&#xff0c;使数据分析变得简单高效。 核心功能 自然语言交互&#x…

【JavaEE进阶】应用分层

目录 &#x1f38b;序言 &#x1f343;什么是应用分层 &#x1f38d;为什么需要应用分层 &#x1f340;如何分层(三层架构) &#x1f384;MVC和三层架构的区别和联系 &#x1f333;什么是高内聚低耦合 &#x1f38b;序言 通过上⾯的练习,我们学习了SpringMVC简单功能的开…

在 Ubuntu22.04 上安装 Splunk

ELK感觉太麻烦了&#xff0c;换个日志收集工具 Splunk 是一种 IT 工具&#xff0c;可帮助在任何设备上收集日志、分析、可视化、审计和创建报告。简单来说&#xff0c;它将“机器生成的数据转换为人类可读的数据”。它支持从虚拟机、网络设备、防火墙、基于 Unix 和基于 Windo…

ES设置证书和创建用户,kibana连接es

1、启动好es 2、进入es容器 docker exec -it es /bin/bash 3、生成ca证书 ./bin/elasticsearch-certutil ca 注&#xff1a;两个红方框位置直接回车 4、生成cert证书 ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 注&#xff1a;前两个红框直接回车&am…

python + ollama 手敲实现私有大模型知识库

在不依赖 LangChain、LlamaIndex 等框架&#xff0c;以及各种知识问答软件的情况下&#xff0c;尽量减少第三方库的使用&#xff0c;仅通过 Ollama 和 NumPy 两个外部库来实现 RAG&#xff08;Retrieval-Augmented Generation&#xff09;应用。 一、安装python 下载&#xf…

TypeScript中的函数:类型安全与高级特性

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

EasyExcel使用详解

文章目录 EasyExcel使用详解一、引言二、环境准备与基础配置1、添加依赖2、定义实体类 三、Excel 读取详解1、基础读取2、自定义监听器3、多 Sheet 处理 四、Excel 写入详解1、基础写入2、动态列与复杂表头3、样式与模板填充 五、总结 EasyExcel使用详解 一、引言 EasyExcel 是…

概率论里的特征函数,如何用卷积定理去理解

概率论里的特征函数&#xff0c;如何用卷积定理去理解_哔哩哔哩_bilibili

具身智能技术趋势

参考&#xff1a; 【北京大学-董豪】具身智能技术趋势分析 2024.8 回答了具身智能技术G3、G4的必要性&#xff0c;以及真实数据、仿真数据、互联网数据之间的关系 具身智能趋势 趋势&#xff1a;寻求一个通用路径实现所有的上肢操作 要求&#xff1a;① 低成本 ② 拓展到所有…

新型智慧城市解决方案-3

智慧城市概述 智慧城市是运用物联网、云计算、大数据等现代科技手段&#xff0c;构建集网络化、信息化、智能化于一体的新型城市模式&#xff0c;涵盖智慧管理、智慧产业、智慧民生等核心内容。 智慧城市建设背景 随着城镇化快速发展&#xff0c;城市病问题日益突出&#x…

【云安全】云原生-K8S-搭建/安装/部署

一、准备3台虚拟机 务必保证3台是同样的操作系统&#xff01; 1、我这里原有1台centos7&#xff0c;为了节省资源和效率&#xff0c;打算通过“创建链接克隆”2台出来 2、克隆之前&#xff0c;先看一下是否存在k8s相关组件&#xff0c;或者docker相关组件 3、卸载原有的docker …

C++的类Class

文章目录 一、C的struct和C的类的区别二、关于OOP三、举例&#xff1a;一个商品类CGoods四、构造函数和析构函数1、定义一个顺序栈2、用构造和析构代替s.init(5);和s.release();3、在不同内存区域构造对象4、深拷贝和浅拷贝5、构造函数和深拷贝的简单应用6、构造函数的初始化列…

HTML<kbd>标签

例子 在文档中将一些文本定义为键盘输入&#xff1a; <p>Press <kbd>Ctrl</kbd> <kbd>C</kbd> to copy text (Windows).</p> <p>Press <kbd>Cmd</kbd> <kbd>C</kbd> to copy text (Mac OS).</p>…

windows下部署安装 ELK,nginx,tomcat日志分析

1.安装包 如上就是elk- windows下部署需要用到的安装包 &#xff08;ps:注意版本需要对应&#xff0c;另外es7版本对应是 jdk8&#xff0c;若更高版本 请自行查询版本对应号&#xff09;。 下载地址&#xff1a; Past Releases of Elastic Stack Software | Elastic 此地址可…

Controller 层优化四步曲

Controller 层优化四步曲 前言 在开发过程中&#xff0c;Controller 层作为系统与外界交互的桥梁&#xff0c;承担着接收请求、解析参数、调用业务逻辑、处理异常等职责。 然而&#xff0c;随着业务复杂度的增加&#xff0c;Controller 层的代码往往会变得臃肿且难以维护。 …