You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:40:21