Post 和 Get 两种方式实现数据导出Excel文件并下载

这篇具有很好参考价值的文章主要介绍了Post 和 Get 两种方式实现数据导出Excel文件并下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Post 和 Get 两种方式实现数据导出Excel文件并下载

前端使用Vue,后端使用Springboot。

一般而言,使用post方式是比较方便的。但有时候,需要下载的数据在后端进行查询的时候很比较复杂的查询条件,而这个查询条件是前端进行下载请求的时候传递的参数,如果参数比较复杂或参数量比较大,超出了get方式的参数限制,就需要使用post方式进行下载请求。


Post方式:

后端将查询到的数据作一些处理之后,将数据写入到请求的响应体中,前端在请求接口之后,在回调函数中,将响应体中的二进制流转化为Blob对象,然后创建一个下载链接进行下载。

后端代码:

    @PostMapping("/export")
    public void export(HttpServletResponse response, @RequestParam("className") String className) {
        try {
            // 根据班级名获取该班级的所有学生的信息
            List<Student> list = StudentService.lists(className);
            // 为了导出的表格中有序号,在定义实体类的时候加了一个serialNo属性
            for(int i = 0; i < list.size(); i++) {
                list.get(i).setSerialNo(i + 1);
            }
            // 设置excel文件的名字,这边可以不用,在前端重新设置了文件名
            String name = "学生信息列表.xlsx";
            String fileName = new String(name.getBytes("gb2312"), "ISO8859-1");
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition","attachment;filename=" + fileName);
            
            // 这里注册的 CustomCellWriteHandler工具类是用来在excel中适应内容自动调整表格宽度的
            ExcelWriter writer = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new CustomCellWriteHandler()).build();
            WriteSheet sheet = EasyExcel.writerSheet(0,"sheet").head(BillList.class).build();
            writer.write(list,sheet);
            writer.finish();
        } catch (Exception e) {
            log.info("jjj", e);
        }
    }

Student 实体类:

@Data
public class Student{
    // ExcelIgnore 注册表示该属性不导出到excel
    @ExcelIgnore
    private Integer id;
    @ExcelProperty(value = "班级", index = 1)
    private String className;
    @ExcelProperty(value = "学号", index = 2)
    private String studentNumber;
    @ExcelProperty(value = "姓名", index = 3)
    private String name;
    @ExcelProperty(value = "性别", index = 4)
    private String gender;
    @

    // 导出excel的序号列, index值表示在导出的excel中的第几列,从0开始
    @ExcelProperty(value = "序号", index = 0)
    private Integer serialNo;
}

CustomCellWriteHandler工具类:

import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Excel 导出列宽度自适应
 */
public class CustomCellWriteHandler extends AbstractColumnWidthStyleStrategy {

    private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) {
        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
        if (needSetWidth) {
            Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
            if (maxColumnWidthMap == null) {
                maxColumnWidthMap = new HashMap<>();
                CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
            }

            Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
            if (columnWidth >= 0) {
                if (columnWidth > 255) {
                    columnWidth = 255;
                }

                Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());
                if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
                    maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
                    writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
                }

            }
        }
    }

    private Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {
        if (isHead) {
            return cell.getStringCellValue().getBytes().length;
        } else {
            CellData cellData = cellDataList.get(0);
            CellDataTypeEnum type = cellData.getType();
            if (type == null) {
                return -1;
            } else {
                switch (type) {
                    case STRING:
                        return cellData.getStringValue().getBytes().length;
                    case BOOLEAN:
                        return cellData.getBooleanValue().toString().getBytes().length;
                    case NUMBER:
                        return cellData.getNumberValue().toString().getBytes().length;
                    default:
                        return -1;
                }
            }
        }
    }
}

前端代码:

// 导入接口文件,一个controller的接口都配置在一个js/ts文件中
import studentApi from '@/api/studentAPI'

// exportExcel 绑定了下载按钮的点击事件
function exportExcel() {
  studentApi.exportExcelUrl(className).then(res=>{
    const url = window.URL.createObjectURL(new Blob([res]))
    let link = document.createElement('a')
    link.style.display = 'none'
    link.href = url
    link.setAttribute('download', '学生信息列表.xlsx')
    document.body.appendChild(link)
    link.click()
    URL.revokeObjectURL(link.href) // 释放URL 对象
    document.body.removeChild(link)
    link = null
  })
}

studentAPI.ts:

import AxiosInstance from "@/plugins/axiosInstance";

const exportExcelUrl = (className:string) => {
    return AxiosInstance.post('/rent/export', {responseType:'arraybuffer', params: {className: className}})
}

export default {
    exportExcelUrl
}

axiosInstance.ts:

import axios from 'axios'

// 配置后端接口地址前缀
const ConfigBaseURL = 'http://localhost:8080/'     // 本地环境
const Axios = axios.create({
    timeout: 5000, 
    baseURL: ConfigBaseURL,
    headers: {
        'Content-Type': 'application/json;charset=UTF-8'
    }
})

Axios.interceptors.request.use(config => {
    return config
}, error => {
    return Promise.reject(error)
})

Axios.interceptors.response.use(response => {
    var data = response.data
    return response.data
}, error => {

    return Promise.reject(error)
})

export default Axios ;

Get方式:

实现方式和post基本一致,后端只需要修改一下接口的请求方式和response的contentType;前端就只需要提供一个链接即可。

后端代码:

    @GetMapping("/export")
    public void export(HttpServletResponse response, @Param("className") String className) {
        try {
            // 根据班级名获取该班级的所有学生的信息
            List<Student> list = StudentService.lists(className);
            // 为了导出的表格中有序号,在定义实体类的时候加了一个serialNo属性
            for(int i = 0; i < list.size(); i++) {
                list.get(i).setSerialNo(i + 1);
            }
            // 设置Excel文件名
            String name = "学生信息列表.xlsx";
            String fileName = new String(name.getBytes("gb2312"), "ISO8859-1");
            response.setContentType("application/vnd.ms-excel;chartset=utf-8");
            response.setHeader("Content-Disposition","attachment;filename=" + fileName);

            // 这里注册的 CustomCellWriteHandler工具类是用来在excel中适应内容自动调整表格宽度的
            ExcelWriter writer = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new CustomCellWriteHandler()).build();
            WriteSheet sheet = EasyExcel.writerSheet(0,"sheet").head(BillList.class).build();
            writer.write(list,sheet);
            writer.finish();
        } catch (Exception e) {
            log.info("jjj", e);
        }
    }

除了请求方式从Post改为了Get,还有一个变化之处就是:

response.setContentType("application/vnd.ms-excel;chartset=utf-8");

前端代码:

// exportExcel 绑定了下载按钮的点击事件
function exportExcel() {
  // 本来后面的接口地址也是配置在接口文件中的,这边为了方便阅读,直接放在了此处。
  var className = 2205
  window.location.href = "http://localhost:8080/student/export?className=" + className
}

参考:

使用VUE+SpringBoot+EasyExcel 整合导入导出demo_娜乌西卡lxm的博客-CSDN博客

通过get或post请求下载excel表格的解决办法_get请求下载excel_一键写代码的博客-CSDN博客

Vue2 导出Excel + 解决乱码问题 —— axios (下载后台传过来的流文件(excel)后乱码问题)_Shimeng_1989的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-501166.html

到了这里,关于Post 和 Get 两种方式实现数据导出Excel文件并下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (一)python发送HTTP 请求的两种方式(get和post )

    注:发送请求(包括请求行、方法类型、头、体) 常见的请求方式有get、post、put、delete            格式:requests.get() (内容: url必填; params选填:url参数字典) # ~ 无参数的get请求 # ~ 有参数的get请求 # ~ 使用params的get请求        知识扩展#  requests.post() post请求分为5种,常用

    2024年02月02日
    浏览(56)
  • JAVA:使用POI SXSSFWorkbook方式导出Excel大数据文件

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java对Microsoft Office格式档案读和写的功能。POI组件可以提供Java操作Microsoft Office的API,导出格式为Office 2003时POI调用的HSSF包,导出格式为Office 2007时,调用XSSF包,而SXSSF包是POI3.8版本之上对XSSF的一个扩展,用

    2024年02月11日
    浏览(39)
  • okhttp异步get和post请求,实现读取获取、增加http文件数据

    Okhttp类,封装方法 activity类 MainActivity

    2024年02月14日
    浏览(22)
  • Java实现数据导出到excel文件

    使用的依赖:Apache提供的poi包 首先导入依赖  核心实现  这个工作表指的是这个 运行结果   现在你完成了往一个单元格里写数据,如果想要做成一个表格,那就需要循环 例如现在有一个需求:现在要统计学生的签到情况,需要把学生的签到记录导出到Excel表中 这里我们用假

    2024年02月11日
    浏览(31)
  • 前端导出word文件的多种方式、前端导出excel文件

    先看效果: 这是页面中的table 这是导出后的效果: 需要的依赖: npm 自行安装,需要看官网的具体参数自行去github上面找对应的参数 具体代码:(先看word模板,在看代码,word中的变量和代码中 doc.setData() 是一一对应的) 包依赖: 代码 导出效果: 需要的依赖: node-xlsx 代码

    2024年03月24日
    浏览(83)
  • vue 实现前端处理 “数组数据“ 转excel格式文件,并导出excel表格

    一、安装插件 XLSX 二、页面引入        希望我的愚见能够帮助你哦~,若有不足之处,还望指出,你们有更好的解决方法,欢迎大家在评论区下方留言支持,大家一起相互学习参考呀~

    2024年01月18日
    浏览(43)
  • GET和POST两种HTTP 方法比较

    超文本传输协议(HTTP)的设计目的是保证客户端与服务器之间的通信。 工作方式是客户端与服务器之间的请求-应答协议。 举例: web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。 客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应

    2024年02月22日
    浏览(28)
  • poi实现excel文件导入导出(基本数据导出、含格式导出、含批注导出、含图片图表导出)——springboot

    本文主要是介绍springboot + poi实现基本的excel文件导入导出,包含数据导出导入时数据的其他需求校验,导出含有批注信息、导出含有图片信息、导出含有图表信息等的介绍等等,主要是一个demo尽可能简单明了的来介绍相关功能即可。有什么问题可以在留言哦!并在文章末尾附

    2024年02月08日
    浏览(65)
  • Unity+Android GET和POST方式的简单实现API请求(人像动漫化)

    Unity与Android的简单交互,Unity打开Android相册并调用 前端时间本想着去弄个小工具,就是图文生成视频,可是这个的API接口的调用的测试权限死活申请不下来,只能放弃,就顺道看了下BaiduAI,竟然被我发现了一个很有趣的API接口。人像动漫化,于是就想着整一个人像动漫化A

    2024年02月10日
    浏览(27)
  • 知识库数据导出为excel-使用JavaScript实现在浏览器中导出Excel文件

    我们智能客服知识库机器人已经开发完成,后端数据库是使用的qdrant向量数据库,但是该数据库并没有导出备份功能,所以我按简单的纯前端实现知识库导出excel数据 使用第三方库(如SheetJS) SheetJS是一个流行的JavaScript库,可帮助处理Excel文件。您可以使用SheetJS来将数据导出

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包