Vue+Springboot,通过EasyExcel工具实现Excel导出

1.前端Vue

(注意:调用后端接口时需指定{responseType:'blob'},否则导出的excel表格打不开)

//Vue导出方法 
exportExcel(){
            //searchParam:为前端需传到后端的所需参数
            var searchParam =  {
                test:this.data.test,


                };
           //调用后端接口,传入参数searchParam
           //注意:调用后端接口时需指定{responseType:'blob'},否则导出的excel表格打不开
            request.post("/exceltest/exportExcel",searchParam,{responseType:'blob'}).then((res) => {
                const aLink = document.createElement('a')
                //为Blob指定导出的文件类型,此处为xlsx[{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}]
                var blob = new Blob([res.data], {type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})
                // //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
                var patt = new RegExp('file
<think>我们参考提供的引用信息,特别是引用[2]和引用[5]提到了使用VueSpringBoot实现Excel导入导出。虽然引用中提及的是Vue2,但我们可以根据Vue3的CompositionAPI进行相应调整。同时,引用[4]和[5]提到了使用POI或EasyExcel来处理Excel文件,其中EasyExcel在处理大数据量时性能更优。根据用户需求,我们需要实现Vue3+SpringBootExcel导出功能。下面将分步骤说明:后端(SpringBoot)部分:1.添加依赖:使用EasyExcel(推荐,因为性能好)或ApachePOI。2.创建导出数据对应的实体类(DTO)。3.编写Controller层,处理导出请求,设置响应头为文件下载,并写入Excel数据流。前端(Vue3)部分:1.使用axios发送GET或POST请求(根据后端接口设计)来触发导出。2.将返回的二进制流转换为Blob对象,然后创建下载链接。下面分别给出示例代码:后端示例(使用EasyExcel):步骤1:添加EasyExcel依赖(pom.xml)```xml<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version><!--请检查最新版本--></dependency>```步骤2:创建DTO(例如StudentDTO.java)```java@DatapublicclassStudentDTO{@ExcelProperty("学号")privateStringstudentId;@ExcelProperty("姓名")privateStringname;@ExcelProperty("年龄")privateIntegerage;}```步骤3:编写Controller```java@RestController@RequestMapping("/api/student")publicclassStudentController{@GetMapping("/export")publicvoidexportStudentList(HttpServletResponseresponse)throwsIOException{//设置响应头response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");StringfileName=URLEncoder.encode("学生列表","UTF-8");response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");//模拟数据,实际应从数据库获取List<StudentDTO>dataList=newArrayList<>();dataList.add(newStudentDTO("001","张三",20));dataList.add(newStudentDTO("002","李四",22));//使用EasyExcel写入数据到输出流EasyExcel.write(response.getOutputStream(),StudentDTO.class).sheet("学生信息").doWrite(dataList);}}```前端示例(Vue3+CompositionAPI):在组件中,我们使用axios发送请求,并处理返回的二进制流。步骤1:安装axios(如果未安装)```bashnpminstallaxios```步骤2:编写导出方法(在Vue组件中)```vue<template><button@click="exportExcel">导出Excel</button></template><scriptsetup>importaxiosfrom'axios';import{ref}from'vue';constexportExcel=async()=>{try{constresponse=awaitaxios({method:'get',url:'http://localhost:8080/api/student/export',//替换为实际后端地址responseType:'blob'//重要:指定响应类型为blob});//创建Blob对象并生成下载链接consturl=window.URL.createObjectURL(newBlob([response.data]));constlink=document.createElement('a');link.href=url;link.setAttribute('download','学生列表.xlsx');document.body.appendChild(link);link.click();//清理document.body.removeChild(link);window.URL.revokeObjectURL(url);}catch(error){console.error('导出失败',error);}};</script>```注意事项:1.后端需要设置正确的响应头,特别是Content-Type和Content-Disposition。2.前端请求时,必须指定responseType为'blob',否则接收到的数据可能不是二进制流。3.如果后端需要根据查询条件导出,可以将参数通过请求发送,这里使用的是GET请求,如果参数复杂可以用POST。另外,引用[4]提到要注意文件格式(xls和xlsx)以及兼容性问题,我们这里使用EasyExcel默认导出xlsx格式,兼容性较好。以上示例实现了基本的导出功能。对于大数据量导出EasyExcel可以分段写入,避免内存溢出。根据上述内容,我们可以生成相关问题:§§相关问题§§1.如何使用Vue3和SpringBoot实现Excel导入功能?2.如何优化SpringBoot导出Excel的性能,特别是处理大数据量时?3.如何设置Excel导出的样式(如字体、颜色、合并单元格等)?4.如何处理Excel导出时的异常情况(如网络中断、数据格式错误)?5.如何实现带查询条件的Excel导出?</think>### Vue3 + SpringBoot 实现 Excel 导出功能教程 #### 一、技术选型 1. **后端**:SpringBoot + EasyExcel(高效处理Excel,避免内存溢出) 2. **前端**:Vue3 + Axios(处理HTTP请求) + FileSaver.js(文件保存) 3. **优势**: - EasyExcel 支持百万级数据导出[^2] - Vue3 Composition API 简化代码逻辑 - 前后端分离架构 #### 二、后端实现步骤(SpringBoot) ##### 1. 添加依赖(pom.xml) ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.2</version> </dependency> ``` ##### 2. 创建DTO(数据转换对象) ```java @Data public class StudentExportDTO { @ExcelProperty("学号") private String studentId; @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; @ExcelIgnore // 忽略导出此字段 private String sensitiveInfo; } ``` ##### 3. 编写Controller ```java @RestController @RequestMapping("/api/excel") public class ExcelExportController { @Autowired private StudentService studentService; @GetMapping("/export-students") public void exportStudents(HttpServletResponse response) throws IOException { // 设置响应头 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("学生列表", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); // 获取数据(实际需替换为数据库查询) List<StudentExportDTO> data = studentService.getExportData(); // 使用EasyExcel导出 EasyExcel.write(response.getOutputStream(), StudentExportDTO.class) .sheet("学生信息") .doWrite(data); } } ``` #### 三、前端实现步骤(Vue3) ##### 1. 安装依赖 ```bash npm install axios file-saver ``` ##### 2. 封装导出方法(utils/excelExport.js) ```javascript import axios from 'axios'; import { saveAs } from 'file-saver'; export const exportExcel = async (url, params, fileName) => { try { const response = await axios({ method: 'get', url, params, responseType: 'blob' // 关键:指定响应类型为二进制流 }); // 创建Blob对象并保存文件 const blob = new Blob([response.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); saveAs(blob, `${fileName}.xlsx`); } catch (error) { console.error('导出失败:', error); alert('文件导出失败,请重试'); } }; ``` ##### 3.Vue组件中使用 ```vue <template> <button @click="handleExport">导出学生数据</button> </template> <script setup> import { exportExcel } from '@/utils/excelExport'; const handleExport = () => { const exportParams = { classId: '2023-01', // 可选查询参数 type: 'full' }; exportExcel('/api/excel/export-students', exportParams, '学生列表_2023'); }; </script> ``` #### 四、关键注意事项 1. **文件格式**: - 使用 `.xlsx` 格式兼容现代Excel[^4] - 设置正确MIME类型:`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` 2. **性能优化**: ```java // 后端分页查询大数据量 PageHelper.startPage(pageNum, pageSize); List<Student> data = studentDao.findLargeData(); ``` 3. **安全处理**: - 敏感数据使用 `@ExcelIgnore` 注解过滤[^2] - 文件名进行URL编码防止乱码 4. **跨域问题**: 在SpringBoot中添加配置: ```java @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://localhost:8080") // Vue地址 .allowedMethods("GET"); } }; } ``` #### 五、完整工作流程 ```mermaid sequenceDiagram participant Vue as 前端(Vue3) participant SpringBoot as 后端(SpringBoot) Vue->>SpringBoot: 发起导出请求(GET /export-students) SpringBoot->>DB: 查询数据 DB-->>SpringBoot: 返回数据 SpringBoot->>SpringBoot: EasyExcel生成xlsx SpringBoot-->>Vue: 返回二进制流(Content-Type: blob) Vue->>Vue: 使用FileSaver保存文件 ``` ### 示例代码说明 1. **后端**:通过EasyExcel实现高效Excel生成 2. **前端**:通过Axios的blob响应类型获取二进制流 3. **文件保存**:使用FileSaver.js触发浏览器下载 ### 常见问题解决 - **乱码问题**:确保文件名使用 `URLEncoder.encode()` 编码 - **内存溢出**:大数据量使用分页查询+分批写入 - **Excel打不开**:检查MIME类型是否正确[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值