如何从Syncfusion Blazor透视表的Ref变量获取文件流?
问题解答
核心结论
可以通过透视表的@ref变量获取导出文件流,再结合透视图表的导出流,将二者合并到同一文件中。
具体实现步骤
1. 获取透视表导出流
通过透视表的@ref引用调用内置导出方法,直接获取内存流:
// 定义透视表引用,与你的页面代码对应 private SfPivotView<dtoDailyFee> Pivot { get; set; } // 封装获取透视表Excel导出流的方法 private async Task<MemoryStream> GetPivotTableStream() { var exportOpts = new ExcelExportOptions(); // 调用Excel导出方法获取流 var stream = await Pivot.ExcelExportAsync(exportOpts); stream.Position = 0; // 重置流指针到起始位置,避免读取异常 return stream; }
2. 获取透视图表导出流
同理,通过透视图表的@ref获取其导出流(示例以PNG格式为例,可按需调整):
// 定义透视图表引用 private SfPivotChart PivotChart { get; set; } private async Task<MemoryStream> GetPivotChartStream() { // 导出图表为PNG格式流 var stream = await PivotChart.ExportAsync(ExportType.PNG); stream.Position = 0; return stream; }
3. 合并流到同一Excel文件
借助Syncfusion的XlsIO库,将透视表和图表合并到同一个Excel文件的不同工作表:
using Syncfusion.XlsIO; private async Task MergeAndExport() { // 获取两个导出流 var pivotStream = await GetPivotTableStream(); var chartStream = await GetPivotChartStream(); using (var excelEngine = new ExcelEngine()) { IApplication excelApp = excelEngine.Excel; excelApp.DefaultVersion = ExcelVersion.Xlsx; // 加载透视表导出的工作簿 IWorkbook pivotWorkbook = excelApp.Workbooks.Open(pivotStream); // 添加新工作表用于放置图表 IWorksheet chartSheet = pivotWorkbook.Worksheets.Add("透视图表"); // 将图表插入新工作表 chartSheet.Pictures.AddPicture(chartStream, PictureType.PNG, 1, 1, 500, 300); // 保存合并后的工作簿到流 MemoryStream mergedStream = new MemoryStream(); pivotWorkbook.SaveAs(mergedStream); mergedStream.Position = 0; // 调用JS方法下载文件 await JS.InvokeVoidAsync("downloadFile", mergedStream.ToArray(), "透视表及图表合集.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); } }
4. 前端触发导出
在Razor页面添加按钮,触发合并导出逻辑:
<button @onclick="MergeAndExport">导出透视表与图表到同一文件</button>
注意事项
- 确保已安装
Syncfusion.Blazor.PivotView、Syncfusion.Blazor.PivotChart和Syncfusion.XlsIO.Net.CoreNuGet包 - 若需将图表导出为Excel原生图表格式,可调整图表导出方法的参数,后续合并逻辑也需对应修改
- 所有流操作完成后务必重置指针位置,否则会出现读取空流的问题
内容的提问来源于stack exchange,提问作者SHUHAIRA K.A
相关产品推荐
相关产品推荐

