C# Blazor 导出到 Excel 文件格式或文件扩展名无效
C# Blazor Export To Excel File Format or File Extension is not valid
我有一个列表,我正尝试使用以下代码和 ClosedXML nuget 包并遵循在线指南将其导出到 excel:
private async TaskClickExportXLS()
{
await ExportToExcel(js, selectedFlyer.DealNo+"_SKY_CAT_Report.xlsx");
}
public async Task ExportToExcel(IJSRuntime js, string fileName)
{
blockProducts = blocks.SelectMany(b => b.Products).Distinct().ToList();
var wb = new XLWorkbook();
var ws = wb.Worksheets.Add("Sku Category Report");
ws.Cell(1, 1).Value = "SKU";
ws.Cell(1, 2).Value = "Product EN";
ws.Cell(1, 3).Value = "Product FR";
ws.Cell(1, 4).Value = "Category";
foreach(var item in blockProducts)
{
ws.Cell(1, 1).Value = item.Sku;
ws.Cell(1, 2).Value = item.ProductEn;
ws.Cell(1, 3).Value = item.ProductFr;
ws.Cell(1, 4).Value = item.MainCategory;
}
MemoryStream XLSStream = new();
XLSStream.Position = 0;
wb.SaveAs(XLSStream);
var XLSSArray = XLSStream.ToArray();
await js.InvokeVoidAsync("BlazorDownloadFile", fileName, XLSSArray);
}
我也从指南中复制了这个 js 运行时文件:
function BlazorDownloadFile(filename, content) {
// Create the URL
const file = new File([content], filename, { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
const exportUrl = URL.createObjectURL(file);
// Create the <a> element and click on it
const a = document.createElement("a");
document.body.appendChild(a);
a.href = exportUrl;
a.download = filename;
a.target = "_self";
a.click();
URL.revokeObjectURL(exportUrl);
}
我的文件已下载,但打开时出现“Excel 无法打开文件,因为文件格式或扩展名无效”。我已经上网并做了研究,我尝试过的事情如下 -
将 Stream 位置设置为 0。
将我的 openfile.js 中的文件类型更改为以下内容: type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
这似乎无法解决问题,而且我的代码在调试时似乎工作正常。如有任何帮助,我们将不胜感激!
我曾尝试遵循该指南,但它对我不起作用。我最终做的是将我的工作簿 (wb) 流式传输到字节数组并将其作为参数传递给 SaveAs 函数:
var bytes = new byte[0];
using (var ms = new MemoryStream())
{
wb.SaveAs(ms);
bytes = ms.ToArray();
}
await SaveAs(JSRuntime, fileName + ".xlsx", bytes);
这是 SaveAs 函数,它是异步任务,就像评论所建议的那样:
async Task SaveAs(IJSRuntime js, string fileName, byte[] data)
{
await js.InvokeAsync<object>(
"BlazorDownloadFile",
fileName,
Convert.ToBase64String(data)
);
}
这是 js:
function BlazorDownloadFile(filename, bytesBase64) {
var link = document.createElement('a');
link.download = filename;
link.href = "data:application/octet-stream;base64," + bytesBase64;
document.body.appendChild(link); // Needed for Firefox
link.click();
document.body.removeChild(link);
}
我相信这些是我使用的参考资料:https://gist.github.com/danielplawgo/ac4d58837224dba7b6fc51de865b12da
https://blazorfiddle.com/s/o8g3elz1
我有一个列表,我正尝试使用以下代码和 ClosedXML nuget 包并遵循在线指南将其导出到 excel:
private async TaskClickExportXLS()
{
await ExportToExcel(js, selectedFlyer.DealNo+"_SKY_CAT_Report.xlsx");
}
public async Task ExportToExcel(IJSRuntime js, string fileName)
{
blockProducts = blocks.SelectMany(b => b.Products).Distinct().ToList();
var wb = new XLWorkbook();
var ws = wb.Worksheets.Add("Sku Category Report");
ws.Cell(1, 1).Value = "SKU";
ws.Cell(1, 2).Value = "Product EN";
ws.Cell(1, 3).Value = "Product FR";
ws.Cell(1, 4).Value = "Category";
foreach(var item in blockProducts)
{
ws.Cell(1, 1).Value = item.Sku;
ws.Cell(1, 2).Value = item.ProductEn;
ws.Cell(1, 3).Value = item.ProductFr;
ws.Cell(1, 4).Value = item.MainCategory;
}
MemoryStream XLSStream = new();
XLSStream.Position = 0;
wb.SaveAs(XLSStream);
var XLSSArray = XLSStream.ToArray();
await js.InvokeVoidAsync("BlazorDownloadFile", fileName, XLSSArray);
}
我也从指南中复制了这个 js 运行时文件:
function BlazorDownloadFile(filename, content) {
// Create the URL
const file = new File([content], filename, { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
const exportUrl = URL.createObjectURL(file);
// Create the <a> element and click on it
const a = document.createElement("a");
document.body.appendChild(a);
a.href = exportUrl;
a.download = filename;
a.target = "_self";
a.click();
URL.revokeObjectURL(exportUrl);
}
我的文件已下载,但打开时出现“Excel 无法打开文件,因为文件格式或扩展名无效”。我已经上网并做了研究,我尝试过的事情如下 -
将 Stream 位置设置为 0。
将我的 openfile.js 中的文件类型更改为以下内容: type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
这似乎无法解决问题,而且我的代码在调试时似乎工作正常。如有任何帮助,我们将不胜感激!
我曾尝试遵循该指南,但它对我不起作用。我最终做的是将我的工作簿 (wb) 流式传输到字节数组并将其作为参数传递给 SaveAs 函数:
var bytes = new byte[0];
using (var ms = new MemoryStream())
{
wb.SaveAs(ms);
bytes = ms.ToArray();
}
await SaveAs(JSRuntime, fileName + ".xlsx", bytes);
这是 SaveAs 函数,它是异步任务,就像评论所建议的那样:
async Task SaveAs(IJSRuntime js, string fileName, byte[] data)
{
await js.InvokeAsync<object>(
"BlazorDownloadFile",
fileName,
Convert.ToBase64String(data)
);
}
这是 js:
function BlazorDownloadFile(filename, bytesBase64) {
var link = document.createElement('a');
link.download = filename;
link.href = "data:application/octet-stream;base64," + bytesBase64;
document.body.appendChild(link); // Needed for Firefox
link.click();
document.body.removeChild(link);
}
我相信这些是我使用的参考资料:https://gist.github.com/danielplawgo/ac4d58837224dba7b6fc51de865b12da https://blazorfiddle.com/s/o8g3elz1