前端与后端协同:实现Excel导入导出功能

🌟 前言

欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍

文章目录

前端与后端协同:实现Excel导入导出功能

在现代Web应用中,Excel文件的导入导出是一个常见的需求。用户希望能够方便地将数据导入到系统中,或者将系统数据导出到Excel文件中。本文将介绍如何在前端和后端之间实现这一功能,示例采用Spring Boot和Vue.js技术栈。

后端依赖

在Spring Boot项目中,我们需要添加EasyExcel依赖来处理Excel文件。EasyExcel是一个简单、省内存的读写Excel的开源工具。

xml 复制代码
<!-- 导出excel  -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.2.1</version>
</dependency>

后端代码

导出Excel

java 复制代码
//@Operation(summary = "导出数据") swagger注解
@PostMapping("exportExcel")
public void exportExcelMenu(HttpServletResponse response) throws IOException {
    // 设置响应头信息
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setCharacterEncoding("utf-8");
    // 编码文件名,避免中文乱码
    String fileName = URLEncoder.encode("轮播图", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
    // 获取数据列表
    List<MenuEntity> list = menuService.list();
    // 设置文件名
    response.setHeader("Content-disposition", "attachment;filename*=" + fileName + ".xlsx");
    // 使用EasyExcel写入数据到输出流
    EasyExcel.write(response.getOutputStream(), MenuEntity.class)
            .sheet("轮播图") // 指定工作表名称
            .doWrite(list); // 执行写入操作
}

导入Excel

java 复制代码
//@Operation(summary = "导入数据") swagger注解
@PostMapping("/importExcel")
public Result importExcelMenu(MultipartFile file) {
    try {
        // 获取文件输入流
        InputStream inputStream = file.getInputStream();
        // 使用EasyExcel读取Excel数据
        List<MenuEntity> list = EasyExcel.read(inputStream, MenuEntity.class)
                .sheet() // 读取第一个工作表
                .headRowNumber(1) // 表头行数
                .doReadSync(); // 同步读取数据
        // 处理导入的数据
        for (MenuEntity entity : list) {
            menuService.saveOrUpdate(entity);
        }
        // 返回成功结果
        return Result.success("导入成功", sdf.format(new Date()));
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
}

前端请求

导入数据

typescript 复制代码
export function importExcelMenu(file: object): Promise<ImportExcelMenuRes> {
    return request.post(`/menuEntity/importExcel`, file);
}

导出数据

typescript 复制代码
export function exportExcelMenu(): Promise<ExportExcelMenuRes> {
    return request.post(`/menuEntity/exportExcel`, {}, {
        responseType: 'arraybuffer', // 设置响应类型为二进制流
        headers: {'Content-Type': 'application/octet-stream'} // 设置请求头
    });
}

前端调用请求

导入操作

typescript 复制代码
const importChangeExcel = (file) => {
  // 限制文件类型
  if (file.raw.type !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
    ElMessage.error('仅支持 .xlsx 格式的文件');
    return false;
  }
  importData.value.append('file', file.raw);
};

const GlobalImport = () => {
  // 执行导入操作
  api.menu.importExcelMenu(importData.value).then((res: any) => {
    ElMessage({message: res.message, type: res.success ? 'success' : 'error'});
  });
};

导出操作

typescript 复制代码
const GlobalExport = () => {
  // 执行导出操作
  api.menu.exportExcelMenu().then((res: any) => {
    // 创建下载链接并触发下载
    const link = document.createElement('a');
    const fileName = "菜单表.xlsx";
    let blob = new Blob([res], {type: 'application/vnd.ms-excel'});
    link.href = URL.createObjectURL(blob);
    link.download = fileName;
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
  });
};

注意

  1. 导入数据的接口中,相当于使用@RequestBody注解获取数据:

    ts 复制代码
    export function importExcelMenu(file: object): Promise<ImportExcelMenuRes> {
        return request.post(`/menuEntity/importExcel`, file);
    }
  2. 导出数据的接口中,需要设置如下请求头:

    ts 复制代码
    {
     responseType: 'arraybuffer', // 设置响应类型为二进制流
     headers: {'Content-Type': 'application/octet-stream'} // 设置请求头
    }

结语

通过上述示例,我们展示了如何在前端和后端之间实现Excel文件的导入导出功能。后端通过Spring Boot和EasyExcel处理Excel文件,前端通过Vue.js发起请求并处理响应。这样的协同工作使得数据的导入导出变得简单而高效。开发者可以根据实际需求调整和扩展这些代码,以适应不同的业务场景。

如果对你有帮助,点赞👍、收藏💖、关注🔔是我更新的动力!👋🌟🚀

🎉 往期精彩回顾

正则表达式完全指南:语法、用法及JavaScript实例
正则表达式与JSON序列化:去除JavaScript对象中的下划线键名
探索async/await的魔力:简化JavaScript异步编程
JavaScript日期格式化:从原始值到用户友好的字符串
入门教程:Windows搭建C语言和EasyX开发环境
CentOS系统下Docker的安装教程
相关推荐
最新资讯动态30 分钟前
HDC 2026 | 对话鲸鸿动能:存量时代,品牌如何夺回营销“主动权”?
前端
最新资讯动态31 分钟前
游戏出海,从产品走向体系
前端
最新资讯动态31 分钟前
20人团队跑出百万DAU、大厂也来抢量:谁在鸿蒙生态跑出加速度
前端
最新资讯动态44 分钟前
千万开发者背后,鸿蒙商业化的B面
前端
爱勇宝3 小时前
AI 时代:智商决定起点,情商决定走多远
前端·ai编程
kyriewen3 小时前
用了半年 Claude Code 后,我尝试关掉它写了一周代码——结果比想象中严重
前端·javascript·ai编程
IT_陈寒4 小时前
Vite的静态资源打包让我熬夜到三点,这坑千万别跳
前端·人工智能·后端
小bo波4 小时前
使用Thread子类创建线程 VS 使用Runnable接口创建线程的区别
java·多线程·thread·并发编程·runnable
徐小夕4 小时前
万字拆解 JitWord:企业级实时协同文档底层架构 + 大模型 AI 融合完整实践
前端·vue.js·github
一份执念5 小时前
uni-app 小程序分包限制处理与主包体积优化实战
前端·微信小程序