Vue3+Typescript+Axios+.NetCore实现导出Excel文件功能

前端代码

javascript 复制代码
//导出Excel
const exportMaintenanceOrderSettlementItemExcelClick = async () => {
  

  let url = `${VITE_APP_API_URL}/api/app/maintenance/settlement-service-item/${currentMaintenanceOrderId.value}/${currentMaintenanceOrderSettlementRow.value.id}`;
  let fileName = `${currentMaintenanceOrder.value.title} ${currentMaintenanceOrderSettlementRow.value.nYearAndMonth} 第【${currentMaintenanceOrderSettlementRow.value.payNum}】期结算服务清单.xlsx`;

  let tokenData = getToken();
  var xhr = new XMLHttpRequest();
  xhr.open("get", url, true); // get、post都可
  xhr.responseType = "blob"; // 转换流
  xhr.setRequestHeader("Authorization", formatToken(tokenData.accessToken)); // token键值对
  xhr.onload = function () {
    if (this.status == 200) {
      var blob = this.response;
      var a = document.createElement("a");
      var url = window.URL.createObjectURL(blob);
      a.href = url;
      a.download = fileName; // 文件名
    }
    a.click();
    window.URL.revokeObjectURL(url);
    exportLoading.value = false;
  };
  xhr.send();
};

后端代码

在后端建一个控制器,控制器方法代码如下:

cs 复制代码
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
cs 复制代码
/// <summary>
/// 导出结算服务项
/// </summary>
/// <param name="maintenanceOrderId"></param>
/// <param name="maintenanceOrderSettlementId"></param>
/// <returns></returns>
[HttpGet]
[Route("settlement-service-item/{maintenanceOrderId}/{maintenanceOrderSettlementId}")]
public async Task<FileResult> ExportMaintenanceOrderSettlementServiceItemsExcelAsync(Guid maintenanceOrderId, Guid maintenanceOrderSettlementId)
{
   var title = $"{maintenanceOrderSettlementId}.xlsx";
   var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";//octet-stream
   var workbook = await _maintenanceOrderServiceItemAppService.GetExportMaintenanceOrderSettlementServiceItemsExcelAsync(maintenanceOrderId, maintenanceOrderSettlementId);


   var bytes = workbook.ConvertToBytes();

   if (bytes != null)
   {
      // 设置响应头
      var cd = new System.Net.Mime.ContentDisposition
      {
         Inline = false,
         FileName = $"{title}", // 指定下载的文件名
         CreationDate = DateTime.Now
      };
      // 添加必须的响应头
      Response.ContentType = contentType;
      Response.Headers.Add("Content-Disposition", cd.ToString());

      // 返回文件流
      return File(bytes, contentType,title,true);

   }


   return null;

}
相关推荐
每日出拳老爷子25 分钟前
[C#] 使用TextBox换行失败的原因与解决方案:换用RichTextBox的实战经验
开发语言·c#
禁默37 分钟前
Linux Vim 编辑器详解:从入门到进阶(含图示+插件推荐)
linux·vim·excel
江号软件分享41 分钟前
有效保障隐私,如何安全地擦除电脑上的敏感数据
前端
web守墓人2 小时前
【前端】ikun-markdown: 纯js实现markdown到富文本html的转换库
前端·javascript·html
Savior`L2 小时前
CSS知识复习5
前端·css
许白掰2 小时前
Linux入门篇学习——Linux 工具之 make 工具和 makefile 文件
linux·运维·服务器·前端·学习·编辑器
中微子6 小时前
🔥 React Context 面试必考!从源码到实战的完整攻略 | 99%的人都不知道的性能陷阱
前端·react.js
中微子7 小时前
React 状态管理 源码深度解析
前端·react.js
加减法原则8 小时前
Vue3 组合式函数:让你的代码复用如丝般顺滑
前端·vue.js
程序猿多布9 小时前
C# 值拷贝、引用拷贝、浅拷贝、深拷贝
c#