C#通过WebAPI控制器将Excel xls发送到js并将其保存为文件

Posted

技术标签:

【中文标题】C#通过WebAPI控制器将Excel xls发送到js并将其保存为文件【英文标题】:C# Sending Excel xls over WebAPI controller to js and save it as a file 【发布时间】:2021-10-08 09:09:25 【问题描述】:

我有一个收集数据的控制器,并且(仅用于测试目的)将其正确保存为 Excel 文件,代码如下所示:

[HttpPost]
public async Task<FileContentResult> ExampleToExcel()

    using (var workbook = new XLWorkbook())
    
        IXLWorksheet worksheet = workbook.Worksheets.Add("Example sheet");

        int index = 1;

        foreach (ExampleItem tmp in exampleItems)
        
            worksheet.Cell(index, 1).Value = tmp.SomeData;
            index++;
        
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        string fileName = "TheName.xlsx");

        using (var stream = new System.IO.MemoryStream())
        
            workbook.SaveAs(stream);
            var content = stream.ToArray();

            var fileContentResult = new FileContentResult(content, contentType)
            
                FileDownloadName = fileName
            ;

            return await Task.FromResult(fileContentResult);
        
    

然后我把它放在 *.js 文件中

exampleExcelExport: function () 
    httpClient.send(
        url: "/Examples/ExampleToExcel",
        method: 'POST'
    ).done(function (response) 
        var blob = response;

        var binaryData = [];
        binaryData.push(blob);

        var a = document.createElement('a');
        a.href = window.URL.createObjectURL(new Blob(binaryData,  type: "application/octet-stream" ))
        a.download = response.FileDownloadName;
        a.dispatchEvent(new MouseEvent('click'));
    );
,

请注意,在控制器端,Excel文件的长度约为30KB,在js端超过50KB,超过0x80的字节编码为2字节。

字符串的区别 *contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

类型:“应用程序/八位字节流”*

可能不是关于,反应比我预期的要大得多。即使它们与 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 相同,保存的 Excel 文件仍然不正确,大小超过 50KB,超过 0x80 的字节编码两次。

请告诉我如何正确操作?如何从响应中获取正确的字节数组内容并将其保存到文件中,以及如何获取响应的名称,因为 response.FileDownloadNameundefined?

【问题讨论】:

【参考方案1】:

您的 api 中似乎没有正确的标头。

您必须为您的请求设置Access-Control-Expose-Headers

一个最小的工作示例如下。

 public ActionResult DownloadExcel() 
        // do the stuff to get your byte array
        var excelBytes = byte[];
        // put in some headers so the file name is availble in the response
        Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
        return File(excelBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ,"filename_you_chose.xlsx")

    

并在javascript端提取文件名:

function(response, status, xhr)
var filename = "";
var disposition = xhr.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1) 
    var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
    var matches = filenameRegex.exec(disposition);
    if (matches != null && matches[1])  
      filename = matches[1].replace(/['"]/g, '');
    

最后从响应中提取内容

【讨论】:

您好,我找到了解决办法。基本上,in 需要在 C# 中编码为 Base64 字符串,并在 js 中解码。就是这样:)【参考方案2】:

我找到了解决方案。基本上,它需要在C#中编码为Base64字符串,并在js中解码。 @Admin:话题可以关闭了!

【讨论】:

以上是关于C#通过WebAPI控制器将Excel xls发送到js并将其保存为文件的主要内容,如果未能解决你的问题,请参考以下文章

将 C# 对象发送到 webapi 控制器

在C#中使用另外一个Spire.XLS来操作Excel数据

如何使用 C# 从远程位置将 Excel csv 或 xls 文件的行读入 ASP.NET 应用程序?

将 excel 表导入 ASP.NET C# MVC

有没有简单的方法将 .xls 文件转换为 .csv 文件? (Excel)

C#组件系列——又一款Excel处理神器Spire.XLS,你值得拥有