我正在尝试从Blazor服务器端项目下载作为excel的项目列表。我使用CsvHelper从列表中生成byte[],并使用下面的代码将byte[]内容作为excel文件下载。
来自Blazor组件的代码如下所示:单击按钮事件下载excel
@inject IJSRuntime JsRuntime
private async Task ExportToExcel()
{
jobStarted = true;
var fileBytes= ExportHelper.ConvertContactDataToCsv(); // This will return byte[] of contacts
if (await JsRuntime.InvokeAsync<bool>("confirm", $"Do you want to Export?"))
{
var fileName = $"Contacts";
await JsRuntime.InvokeAsync<object>("saveAsFile", fileName, Convert.ToBase64String(fileBytes));
}
jobStarted = false;
}
Javascript代码如下
window.saveAsFile = function (fileName, byteBase64) {
var link = this.document.createElement('a');
link.download = fileName;
link.href = "data:application/vnd.ms-excel;base64," + byteBase64;
this.document.body.appendChild(link);
link.click();
this.document.body.removeChild(link);
}
执行此操作将生成没有任何问题的文件,但在使用Microsoft打开文件时,警告消息如下
'Contacts.xls‘的文件格式和扩展名不匹配。文件可能已损坏或不安全。除非你相信它的来源,否则不要打开它。你想打开它吗?
如果我无视警告并继续打开excel中的所有内容,看起来很好。
现在,我尝试在JS代码中生成扩展名xlsx和不同mime类型的文件,更改如下
var fileName = $"Contacts.xlsx";
在JS内部,分别尝试了这两种组合
link.href = "data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64," + byteBase64;
link.href = "data:application/octet-stream;base64," + byteBase64;
执行的代码没有生成任何问题和文件,但是在打开文件时警告如下
Excel无法打开文件“Contacts.xlsx”,因为文件扩展名的文件格式无效。验证文件没有损坏,并且文件扩展名是否与文件的格式相匹配。
我根本无法打开这个文件。
那么,什么是正确的MIME类型,以确保下载的excel文件可以在Excel中打开而不受警告
发布于 2022-01-06 21:05:16
由于您使用的是CsvHelper
(通过ConvertContactDataToCsv
),所以输出文件是逗号分隔的值文本文件,而不是二进制Excel .xls
文件。
不要使用.xls
文件扩展名,而是使用.csv
;所以使用Contacts.csv
而不是Contacts.xls
。
对于mime类型,可以使用text/csv
。
但最重要的是,是错误的文件扩展名导致了该文件的Excel
错误。
https://stackoverflow.com/questions/70613084
复制相似问题