用于导出到 csv 的 Blazor 组件使 csv 为空

问题描述 投票:0回答:1

我制作了一个 Blazor 组件,它获取对象集合,然后将其导出到 csv 并将其下载给用户,csv 正在下载,但输出文件为空。 我从以下两篇文档文章中获得了代码: https://learn.microsoft.com/en-us/aspnet/core/blazor/file-downloads?view=aspnetcore-6.0#download-from-a-stream https://joshclose.github.io/CsvHelper/getting-started/#writing-a-csv-file

window.downloadFileFromStream = async (fileName, contentStreamReference) => {
    const arrayBuffer = await contentStreamReference.arrayBuffer();
    const blob = new Blob([arrayBuffer]);
    const url = URL.createObjectURL(blob);
    const anchorElement = document.createElement('a');
    anchorElement.href = url;
    anchorElement.download = fileName ?? '';
    anchorElement.click();
    anchorElement.remove();
    URL.revokeObjectURL(url);
}
@using System.IO
@using CsvHelper
@using System.Globalization
@inject IJSRuntime JS
@code {
    [Parameter, EditorRequired]
    public IEnumerable<object>? objects { get; set; }
    [Parameter, EditorRequired]
    public string? FileName { get; set; }
    [Parameter, EditorRequired]
    public string? TextDisplay { get; set; }
    private Stream GetFileStream()
    {
        var memoryStream = new MemoryStream();
        var streamWriter = new StreamWriter(memoryStream);

        var csvWriter = new CsvWriter(streamWriter, culture: CultureInfo.InvariantCulture);
        csvWriter.WriteRecords(objects);
        // Reset memory stream
        memoryStream.Position = 0;

        return memoryStream;
    }
    private async Task DownloadFileFromStream()
    {
        using var fileStream = GetFileStream();
        using var streamRef = new DotNetStreamReference(stream: fileStream);
        await JS.InvokeVoidAsync("downloadFileFromStream", FileName, streamRef);
    }
}
<MudIconButton Icon="@Icons.Material.Filled.Download" Color="Color.Secondary" Size="Size.Small" aria-label="Export to CSV" OnClick="DownloadFileFromStream">@TextDisplay</MudIconButton>
blazor blazor-server-side csvhelper
1个回答
0
投票

更改为

GetFileStream
处置
csvWriter.WriteRecords

private Stream GetFileStream()
{
    var memoryStream = new MemoryStream();
    using (var streamWriter = new StreamWriter(memoryStream, leaveOpen: true))
    using (var csvWriter = new CsvWriter(streamWriter, culture: CultureInfo.InvariantCulture))
    {
        csvWriter.WriteRecords(objects);
    }

    // Reset memory stream
    memoryStream.Position = 0;

    return memoryStream;
}
© www.soinside.com 2019 - 2024. All rights reserved.