如何在WinUI3应用中将ListView数据导出至Excel?
WinUI3中导出ListView数据到Excel的解决方案
Office Interop依赖桌面COM组件,在WinUI3(尤其是UWP/打包成MSIX的应用)中会因沙箱限制无法正常工作,且依赖本地安装的Excel,兼容性差。推荐使用开源Excel处理库实现导出,无需依赖Excel,跨平台且稳定。
方案步骤
1. 安装开源Excel库
推荐使用以下任意一个NuGet包:
- ClosedXML:专为.xlsx格式设计,API简洁友好
Install-Package ClosedXML - NPOI:支持.xls和.xlsx格式,完全开源免费
Install-Package NPOI
2. 导出逻辑实现(以ClosedXML为例)
假设你的ListView绑定的是ObservableCollection<MyDataModel>,MyDataModel包含Name、Age、Email三个属性:
第一步:获取ListView中的数据
// 从ListView中提取数据 var dataList = MyListView.Items.Cast<MyDataModel>().ToList();
第二步:创建Excel文件并写入数据
using ClosedXML.Excel; // 创建工作簿和工作表 var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("导出数据"); // 写入表头 worksheet.Cell(1, 1).Value = "姓名"; worksheet.Cell(1, 2).Value = "年龄"; worksheet.Cell(1, 3).Value = "邮箱"; // 逐行写入数据 int rowNum = 2; foreach (var item in dataList) { worksheet.Cell(rowNum, 1).Value = item.Name; worksheet.Cell(rowNum, 2).Value = item.Age; worksheet.Cell(rowNum, 3).Value = item.Email; rowNum++; } // 自动调整列宽,提升可读性 worksheet.Columns().AdjustToContents();
第三步:保存文件到用户指定位置
WinUI3中需使用FileSavePicker确保文件访问权限,分两种场景:
场景1:WinUI3 UWP/打包应用
var savePicker = new FileSavePicker(); savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; savePicker.FileTypeChoices.Add("Excel文件", new List<string> { ".xlsx" }); savePicker.SuggestedFileName = "导出数据"; // 弹出保存对话框 StorageFile file = await savePicker.PickSaveFileAsync(); if (file != null) { // 将工作簿写入文件流 using (var stream = await file.OpenStreamForWriteAsync()) { workbook.SaveAs(stream); } await new MessageDialog("导出成功").ShowAsync(); }
场景2:WinUI3 Desktop应用
需额外设置窗口句柄以兼容桌面环境:
var savePicker = new FileSavePicker(); savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; savePicker.FileTypeChoices.Add("Excel文件", new List<string> { ".xlsx" }); savePicker.SuggestedFileName = "导出数据"; // 绑定窗口句柄(需引用WinRT.Interop) var windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(MainWindow.Instance); WinRT.Interop.InitializeWithWindow.Initialize(savePicker, windowHandle); StorageFile file = await savePicker.PickSaveFileAsync(); if (file != null) { using (var stream = await file.OpenStreamForWriteAsync()) { workbook.SaveAs(stream); } await new MessageDialog("导出成功").ShowAsync(); }
核心优势
- 无需依赖本地安装的Excel,避免环境兼容性问题
- 不受WinUI3沙箱限制,UWP和Desktop场景均适用
- 开源库维护活跃,API文档完善,问题排查更方便
内容的提问来源于stack exchange,提问作者user21071509
相关产品推荐
相关产品推荐

