Spring接口返回的类型是json格式,里面字段对应base64格式的excel文件

news/2024/12/29 6:16:18/

使用场景:需要对前端导入的excel文件中的内容进行验证,如期中有验证失败的信息需要转成excel反馈给前端,用户下载查看信息,并且前端需要获取json返回的状态,给用户提示失败或者成功,所以需要导出json的同时返回excel

 废话不多说,直接上代码

后端代码:

    @ApiOperation(value = "接口返回的类型是json格式,里面字段对应base64格式的excel文件", notes = "接口返回的类型是json格式,里面字段对应base64格式的excel文")@RequestMapping(value = "exportDemo")public Map exportDemo() throws Exception {Map map = new HashMap();map.put("success", false);map.put("message", "导入失败");HSSFWorkbook errWorkbook = new HSSFWorkbook(); //创建ExcelHSSFSheet sheet = errWorkbook.createSheet("Sheet1");//创建SheetHSSFRow T_row = sheet.createRow(0);//创建一行表头T_row.createCell(0).setCellValue("必填,学号");//设置表头列名T_row.createCell(1).setCellValue("学生姓名");//设置表头列名T_row.createCell(2).setCellValue("培养单位");//设置表头列名T_row.createCell(3).setCellValue("必填,主导师工号");//设置表头列名T_row.createCell(4).setCellValue("主导师姓名");//设置表头列名T_row.createCell(5).setCellValue("联合导师工号(如有)");//设置表头列名T_row.createCell(6).setCellValue("联合导师姓名(如有)");//设置表头列名T_row.createCell(7).setCellValue("错误信息");//设置表头列名HSSFCellStyle style = errWorkbook.createCellStyle();style.setDataFormat(errWorkbook.createDataFormat().getFormat("@")); // 设置为文本格式for (int i = 0; i < T_row.getPhysicalNumberOfCells(); i++) {sheet.setDefaultColumnStyle(i, style);}for (Cell cell : T_row) {cell.setCellStyle(style);cell.setCellType(CellType.STRING);}ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 将EXCEL文件写进流内errWorkbook.write(byteArrayOutputStream);byte[] bytes = byteArrayOutputStream.toByteArray();String base64ExlCode = Base64Utils.encodeToString(bytes);map.put("excel",base64ExlCode);return map;} 

前端代码1:

        , exportDemo: function () {var self = thisvar url = baseUrl + self.QUERY_URL + '/exportDemo';//定义参数var myform = new FormData();$.ajax({url: url,data: myform,dataType: "json",type: 'post',async: true,//重要,必须设置 falsecontentType: false,//重要,必须设置 falseprocessData: false,beforeSend: function () {self.$Spin.show();},complete: function () {},success: function (res) {alert(res.message)//下载文件var blob = self.dataURLtoBlob(res.excel);var downloadUrl = window.URL.createObjectURL(blob);var anchor = document.createElement("a");anchor.href = downloadUrl;anchor.download = decodeURI("导入错误.xls");anchor.click();}, error: function (data) {self.$Spin.hide();self.$Message.error({content: data.responseText, duration: 5, background: true});}})}

前端代码2:

        // 核心 将base64的字符串转为文件流, dataURLtoBlob: function (base64Str) {var bstr = atob(base64Str);var n = bstr.length;var u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}// 下载的是excel格式的文件return new Blob([u8arr], {type: "application/vnd.ms-excel"});//其他类型:// 'doc' => 'application/msword',// 'bin' => 'application/octet-stream',// 'exe' => 'application/octet-stream',// 'so' => 'application/octet-stream',// 'dll' => 'application/octet-stream',// 'pdf' => 'application/pdf',// 'ai' => 'application/postscript',// 'xls' => 'application/vnd.ms-excel',// 'ppt' => 'application/vnd.ms-powerpoint',// 'dir' => 'application/x-director',// 'js' => 'application/x-javascript',// 'swf' => 'application/x-shockwave-flash',// 'xhtml' => 'application/xhtml+xml',// 'xht' => 'application/xhtml+xml',// 'zip' => 'application/zip',// 'mid' => 'audio/midi',// 'midi' => 'audio/midi',// 'mp3' => 'audio/mpeg',// 'rm' => 'audio/x-pn-realaudio',// 'rpm' => 'audio/x-pn-realaudio-plugin',// 'wav' => 'audio/x-wav',// 'bmp' => 'image/bmp',// 'gif' => 'image/gif',// 'jpeg' => 'image/jpeg',// 'jpg' => 'image/jpeg',// 'png' => 'image/png',// 'css' => 'text/css',// 'html' => 'text/html',// 'htm' => 'text/html',// 'txt' => 'text/plain',// 'xsl' => 'text/xml',// 'xml' => 'text/xml',// 'mpeg' => 'video/mpeg',// 'mpg' => 'video/mpeg',// 'avi' => 'video/x-msvideo',// 'movie' => 'video/x-sgi-movie',}


http://www.ppmy.cn/news/1278822.html

相关文章

Linux笔记本电脑投屏到电视,用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开网址webcast.airdroid.com。这个网址就是AirDroid Cast的网页版。你可以看到中间白色框框的…

HarmonyOS 点击物理返回键再按一次退出系统(eTS)

&#xff08;1&#xff09;首先&#xff0c;定义一个变量&#xff0c;用于计算用户两次按下返回键的时间差&#xff1a; //todo 定义全局变量State exitTime: number 0;&#xff08;2&#xff09;然后就是一个捕捉用户按下返回键的事件&#xff1a; //todo 定义全局变量State …

解锁Word新技能,实现下拉框选择功能

项目实施过程中&#xff0c;涉及到从word导入数据&#xff0c;以前常规的搞法是从excel做导入&#xff0c;下拉框实现也比较简单&#xff0c;用数据有效性设置即可&#xff0c;其实当时也考虑用excel来做&#xff0c;因为业务场景的关系&#xff0c;看起来没有word直观&#xf…

Guava的TypeToken在泛型编程中的应用

第1章&#xff1a;引言 在Java世界里&#xff0c;泛型是个相当棒的概念&#xff0c;能让代码更加灵活和类型安全。但是&#xff0c;泛型也带来了一些挑战&#xff0c;特别是当涉及到类型擦除时。这就是TypeToken大显身手的时候&#xff01; 作为Java程序员的咱们&#xff0c;…

Java与前端:2023年的真实状况与焦虑解读

一、引言 在2023年&#xff0c;IT圈中流传着一些关于Java和前端的言论&#xff0c;这些言论引起了广泛的关注。有些人认为“Java已死、前端已凉”&#xff0c;而另一些人则持不同观点。那么&#xff0c;这些言论背后的真相是什么&#xff1f;它们是在贩卖焦虑吗&#xff1f;本…

基于jdk11和基于apache-httpclient的http请求工具类

1.基于apache-httpclient 需要引入依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.5</version></dependency> 工具类如下&#xff1a; package com.bw.e…

jvm 面试

1说一下 jvm 的主要组成部分&#xff1f;及其作用&#xff1f; 类加载器&#xff08;ClassLoader&#xff09;&#xff1a;负责将字节码文件加载到内存中&#xff0c;并生成对应的类对象。 执行引擎&#xff08;Execution Engine&#xff09;&#xff1a;负责执行字节码指令&am…

【数据结构】什么是树?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;树的定义 &#x1f4cc;树的相关概念 &#x1f4cc;线性结构与树结构的对比 &#x1f4cc;树的抽象数据类型 &#x1f4cc;树的存储结构 &#x1f38…