• 【Excel】根据模板导出Excel,后端返回文件流前端下载


    需求描述:

    前端发送请求后,接收后端返回的文件流(一般是乱码),实现导出Excel(根据模板生成Excel)

    OrderManageController.cs

    /// <summary>
    /// 通过模板导出Excel文件
    /// </summary>
    /// <param name="orderInfoList"></param>
    [HttpPost, Route("ExportConfirmOrderList")]
    public FileResult ExportConfirmOrderList(List<OrderInfoView> orderInfoList)
    {
        string templatePath = ServerMapPath("/ui/FileTemplate/汇款信息模板.xlsx");
        string sheetName = "汇款信息";
    
        IWorkbook workBook;
        using (FileStream fs = System.IO.File.Open(templatePath, FileMode.Open, FileAccess.Read))
        {
            workBook = new XSSFWorkbook(fs);
        }
    
        using (MemoryStream ms = new MemoryStream())
        {
            var sheet = workBook.GetSheet(sheetName);
            int startRowIndex = 2;   //首行为提示文字,正式数据从第二行开始
            foreach (var orderInfo in orderInfoList)
            {
                var row = sheet.CreateRow(startRowIndex++);
                row.CreateCell(0).SetCellValue(orderInfo.ProjectCode1Name);
                row.CreateCell(1).SetCellValue(orderInfo.AppName);
                row.CreateCell(2).SetCellValue(orderInfo.PayAccountName);
                row.CreateCell(3).SetCellValue(orderInfo.OrderNo);
                row.CreateCell(4).SetCellValue(orderInfo.remitter);
                row.CreateCell(5).SetCellValue(orderInfo.RemittanceAmount.ToString());
                row.CreateCell(6).SetCellValue(orderInfo.RemittanceMobile);
                row.CreateCell(7).SetCellValue(orderInfo.RemitRemark);
            }
    
            workBook.Write(ms);
            ms.Seek(0, SeekOrigin.Begin);
            //return File(bt, "application/vnd.ms-excel", "汇款信息.xlsx");  如果这样写一直报会无法找到关闭的流的错误,因为return的时候ms流已经被Dispose()了  
            byte[] bt = ms.ToArray(); //解决方案:将ms用中间量存下来,转为byte数组以便于关闭ms 
            return File(bt, "application/vnd.ms-excel", "汇款信息.xlsx");
        } 
    }

    order.js

    export function ExportConfirmOrderList(data) { 
        return request({
            url: '/order/ExportConfirmOrderList', 
            data, 
            method: 'post',
            responseType: 'blob'  //在请求接口的时候请求头要添加responseType: 'blob'
        }) 
    }

    orderList.vue

    exportConfrimOrderToExcel(){ 
      ExportConfirmOrderList(this.exportdata).then(res => {
        // console.log(res)
        var that = this
        //创建一个隐藏的a连接,
        const link = document.createElement('a')
        link.style.display = 'none'
    
        //Blob对象(是一个可以存储二进制文件的容器);第一个参数为一个数据序列,可以是任意格式的值,第二个参数用于指定将要放入Blob中的数据的类型,比如:type: 'application/x-excel' 或 type: 'text/plain'
        const blob = new Blob([res], {type: 'application/vnd.ms-excel'})
        
        //URL.createObjectURL()方法通过传入的参数(参数:用于创建url的file对象,Blob对象或者MediaSource对象),创建一个指向该参数对象的URL,绑定到创建a标签的href属性上
        link.href = URL.createObjectURL(blob)
        link.download = '汇款信息.xlsx'   //自定义文件名
    
        //往body上面append这个a标签,并执行a标签的点击事件,进行文件的导出,最后导出成功后,把a标签从body上面移除
        document.body.appendChild(link) 
        link.click()  //模拟点击事件
        document.body.removeChild(link)
      })
    },
  • 相关阅读:
    2016.6.21 -Dmaven.multiModuleProjectDirectory system propery is not set,Check $M2_HOME environment variable and mvn script match.
    2016.6.21 maven:Failure to transfer ... from ....
    2016.7.5 如何在maven中添加所需依赖(只知道jar包的部分名字的情况)
    2016.6.20 maven更改repository的位置
    2016.6.20 maven下载与安装步骤
    2016.6.20 在Eclipse配置Tomcat服务器的步骤
    2016.6.21 eclipse配置server locations时按钮为灰色
    2016.6.21 将Eclipse中项目部署到tomcat下
    2016.6.20 tomcat安装出现No Java Virtual Machine found in..
    vue小荔枝,时间控件,动态按月份增减。
  • 原文地址:https://www.cnblogs.com/zhaoyl9/p/16092319.html
Copyright © 2020-2023  润新知