【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)
  })
},
复制代码

 

posted @   智者见智  阅读(740)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2021-04-02 【LayUI】 动态table操作:edit、switch、tool、checkbox
点击右上角即可分享
微信分享提示