vue+springboot 导出Excel表(已解决乱码)

本文档提供了一种使用Vue前端和SpringBoot后端框架导出Excel表格的完整示例,解决了常见的导出失败和乱码问题。通过设置响应类型为'blob'解决前端乱码,后端使用Apache POI库处理Excel生成,并设置了文件头避免乱码。同时,提供了关键代码片段供开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看过很多以前端vue,后端以springboot为框架导出Excel表,要么导出失败,要么导出Excel乱码,还有些解决有乱码的文章还需要收费,最后还是要自己探索一番才能解决!

废话不多说,直接上代码!

前端vue代码:

 exportExcel() {
                axios({
                    method: 'POST',
                    url: '/order/exportExcel',
                    params: {
                        //order: "",
                    },
                    data: this.orderList,
                    responseType: 'blob' //解决乱码问题
                }).then(data => {

                    if (!data) {
                        this.$message.error('下载内容为空');
                        return
                    }
                    let url = window.URL.createObjectURL(new Blob([data], {type: 'application/xls'}));
                    let link = document.createElement('a');
                    link.style.display = 'none';
                    link.href = url;
                   

                    link.setAttribute('download', '订单列表.xls');
                    document.body.appendChild(link);
                    link.click();
                    //释放URL对象所占资源
                    window.URL.revokeObjectURL(url);
                    //用完即删
                    document.body.removeChild(link);

                }).catch(error => {
                    this.$message.error(error);

                })

            }

后端需要的依赖:

<!--导出 Excel 表-->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>4.1.1</version>
</dependency>

后端controller层代码:

@PostMapping("/exportExcel")
    public void exportExcel(@RequestBody List<Order> orders, HttpServletRequest request, HttpServletResponse response) {//@RequestBody List<Order> orders,
        POIUtils.exportExcel(orders, request, response);
    }

POIUtils 中 exportExcel()方法如下:

 public static void exportExcel(List<Order> list, HttpServletRequest request, HttpServletResponse response) {
        //1. 创建一个 Excel 文档
        HSSFWorkbook workbook = new HSSFWorkbook();
        //2. 创建文档摘要
        workbook.createInformationProperties();
        //3. 获取并配置文档信息
        DocumentSummaryInformation docInfo = workbook.getDocumentSummaryInformation();
        //文档类别
        docInfo.setCategory("订单信息");
        //文档管理员
        docInfo.setManager("xgm");
        //设置公司信息
        docInfo.setCompany("www.xxx.com");
        //4. 获取文档摘要信息
        SummaryInformation summInfo = workbook.getSummaryInformation();
        //文档标题
        summInfo.setTitle("订单信息表");
        //文档作者
        summInfo.setAuthor("xgm");
        // 文档备注
        summInfo.setComments("本文档由 xgm 提供");
        //5. 创建样式
        //创建标题行的样式
        HSSFCellStyle headerStyle = workbook.createCellStyle();
        headerStyle.setFillForegroundColor(IndexedColors.YELLOW.index);
        headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        HSSFCellStyle dateCellStyle = workbook.createCellStyle();
        dateCellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
        HSSFSheet sheet = workbook.createSheet("订单信息表");
        //设置列的宽度
        sheet.setColumnWidth(0, 5 * 256);
        //逻辑省略些。。。。。,需要多少列,自己后面续上呗
        

        //6. 创建标题行
        HSSFRow r0 = sheet.createRow(0);
        HSSFCell c0 = r0.createCell(0);
        c0.setCellValue("订单号");
        c0.setCellStyle(headerStyle);
        //逻辑省略些。。。。。

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        for (int i = 0; i < list.size(); i++) {
            Order order = list.get(i);
            HSSFRow row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue(order.getOrderId());
            //逻辑省略些。。。。。
            
 
        }

        try {
            FileOutputStream out = new FileOutputStream(new                 
            File("C:\\token\\ITouch\\excel\\订单表.xls"));
            workbook.write(out);

            response.reset(); // 非常重要

            response.setHeader("Content-disposition", "attachment;fileName=" + "订单表" + 
            ".xls");
            response.setContentType("application/octet-stream;charset=utf-8");
            OutputStream outputStream = response.getOutputStream();
            workbook.write(outputStream);
            outputStream.flush();
            outputStream.close();
            out.close();


        } catch (IOException e) {
            e.printStackTrace();
        }

}

 

 

 

<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、付费专栏及课程。

余额充值