Vue + Spring boot 实现excel上传功能

本文详细介绍了如何在Vue项目中使用ElementUI组件库的upload控件上传Excel文件,并通过axios与后端进行交互。讲解了配置action属性、使用before-upload钩子以及MultipartFile在后端的处理方式。

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

首先先看前端Vue,在这里我们使用了elementUI中的upload控件

       <el-upload
            class="upload-demo"
            drag
            action="#"
            multiple
            :before-upload="beforeUpload">
            <i class="el-icon-upload"></i>
            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em>            </div>
        </el-upload>
    

其中action里填一个无意义的地址,因为如果使用action中的地址,则url会默认使用Vue项目打开的ip地址及端口号,如http://127.0.0.1:8043/,

此时如果再在action后面填写http://127.0.0.1:8080/upload,那么完整的请求路径就会变成http://127.0.0.1:8043/127.0.0.1:8080/excel

解决的办法就是使用before-upload,然后在方法里指定url

1 beforeUpload(file){
2             var formdata = new FormData();
3             formdata.append('file',file);
4             this.$axios.post('http://127.0.0.1:8080/excel',formdata,{ headers : { 'Content-type':'multipart/form-data'}});
5         },

这里我们使用formdata来保存传输文件数据,由于是上传excel,所以必须在header里更改content-type,否则会报415错误

 

接下来看后台代码

1 @RequestMapping(value = "/excel",method = RequestMethod.POST)
2     void getAllByExcel(@RequestParam("file") MultipartFile MPfile) 

在这里我们使用MultipartFile来接收前端传来的file,但它与file有些区别,所以我们使用一个函数来将它转化为file类型,以供后面使用

 1 File transfer(MultipartFile file) {
 2         if (file != null) {
 3             try {
 4                 String filePath = "C:\\Users\\JAJ5SZH\\IdeaProjects\\Will-Backend\\UploadFile\\"+file.getOriginalFilename();
 5                 File savedFile = new File(filePath);
 6                 boolean isCreateSuccess = savedFile.createNewFile();
 7                 // 是否创建文件成功
 8                 if (isCreateSuccess) {
 9                     //将文件写入
10                     file.transferTo(savedFile);
11                     return savedFile;
12                 }
13             } catch (Exception e) {
14                 e.printStackTrace();
15             }
16         } else {
17             System.out.println("文件是空的");
18         }
19         return null;
20     }

主要使用的是transferTo()这个MultipartFile封装好的函数,在filePath里面定义我们存放文件的文件夹,文件的命名可以使用uuid

至此,就实现了上传excel的功能,欢迎指正交流!

 

转载于:https://www.cnblogs.com/JINJAY/p/10471928.html

Vue.js和Spring Boot项目中导出Excel,通常涉及到前端利用JavaScript库如js-xlsx、vue-excel-export等处理数据,然后通过Ajax请求将数据发送到后端,由Spring Boot服务生成Excel文件并返回给前端。 步骤大致如下: 1. **前端处理**: - 安装必要的依赖库,如`axios`用于发起HTTP请求,`xlsx`或`file-saver`用于生成Excel。 - 使用Vue组件编写一个导出按钮,点击时获取需要的数据,例如从Vuex状态管理中获取,或从API接口获取。 ```javascript import { downloadFile } from 'vue-excel-export'; export function exportToExcel(data) { return new Promise((resolve, reject) => { // 将数据转换为合适的表格格式 const workbook = XLSX.utils.book_new(); let worksheet = XLSX.utils.json_to_sheet(data); // 添加工作表到workbook XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); // 保存为Excel文件并通过浏览器下载 downloadFile(workbook, 'example.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); resolve(); }); } ``` 2. **调用后端API**: - 在Vue组件中,当用户触发导出操作,通过`axios.post`或其他HTTP客户端发送POST请求到Spring Boot API。 ```javascript axios.post('/api/exportExcel', { data: this.tableData }) .then(response => { if (response.data.status === 'success') { exportToExcel(response.data.content).catch(err => console.error('Export failed:', err)); } }) .catch(error => { console.error('Error exporting to Excel:', error); }); ``` 3. **后端处理**: - Spring Boot控制器接收到请求后,可以使用Apache POI或jxl等库生成Excel,并设置响应头为流式内容,如`Content-Disposition`。 ```java @GetMapping("/exportExcel") public ResponseEntity<ultipartFile> exportExcel(@RequestBody List<DataEntity> dataList) { // ...处理数据并生成Excel文件 byte[] excelBytes = generateExcelFromData(dataList); HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=example.xlsx"); return ResponseEntity.ok() .headers(headers) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(new FileSystemResource(new ByteArrayInputStream(excelBytes))); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值