C# 开辟应用篇——C# 基于WPF实现数据纪录导出excel详解

[复制链接]
发表于 2025-12-19 19:59:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
弁言        
一、基于 EPPlus 库实现WPF导出EXCEL功能
项目准备
创建 WPF 界面
后端代码
EPPlus  LicenseContext 属性设置
关键点分析
二、基于 ClosedXML 库实现WPF导出EXCEL功能
安装 ClosedXML
利用 ClosedXML 创建和操纵 Excel 文件
读取 Excel 文件
常见操纵
留意事项
三、 ClosedXML 与 EPPlus利用场景和优缺点对比
ClosedXML
EPPlus​​​​​​​
实用场景
总结


弁言        

        实现基于C#的WPF应用步调导出数据到 Excel 的功能,可以利用一个盛行的库,比如 EPPlus 或 ClosedXML。这些库可以将 DataTable 数据导出为 Excel 文件,并提供简单易用的 API。 下面是利用 EPPlus 库实现导出功能的示例实现过程先容。
       为了更详细分析实现过程,在 C# WPF 应用步调中,我们可以创建一个学天生绩查询体系,该体系从数据库中提取数据,在界面上体现,并答应用户将数据导出为 Excel 文件。我们将利用 DataGrid 体现数据,并利用 EPPlus 库和ClosedXML库实现导出功能。以下是实现该功能的详细步调。
一、基于 EPPlus 库实现WPF导出EXCEL功能

项目准备

步调 1:设置数据库
假设我们利用 SQLite 数据库,此中有一个名为 StudentScores 的表。该表具有以下结构:
Column NameData TypeStudentIDINTEGERNameTEXTSubjectTEXTScoreREAL步调 2:安装 NuGet 包
在项目中安装以下 NuGet 包:


  • System.Data.SQLite:用于毗连 SQLite 数据库。(根据现实应用中选择数据库,本文仅以 SQLite 数据库为例)
  • EPPlus:用于导出数据到 Excel。
  1. Install-Package System.Data.SQLite
  2. Install-Package EPPlus
复制代码

创建 WPF 界面

在 XAML 文件中,创建一个简单的界面,包罗一个 DataGrid 和一个导出按钮。
  1. <Window x:Class="StudentScoreApp.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         Title="学生成绩查询" Height="400" Width="600">
  5.     <Grid>
  6.         <DataGrid x:Name="scoreDataGrid" AutoGenerateColumns="True" HeadersVisibility="Column" IsReadOnly="True"
  7.                   Margin="10,10,10,50" />
  8.         <Button Content="导出" Width="100" Height="30" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="10" Click="ExportScore_Click"/>
  9.     </Grid>
  10. </Window>
复制代码
后端代码

步调 1:从数据库加载数据
在代码背面,编写从数据库加载数据的方法。
  1. using System;
  2. using System.Data;
  3. using System.Data.SQLite;
  4. using System.Windows;
  5. namespace StudentScoreApp
  6. {
  7.     public partial class MainWindow : Window
  8.     {
  9.         private DataTable _scoreTable;
  10.         public MainWindow()
  11.         {
  12.             InitializeComponent();
  13.             LoadData();
  14.         }
  15.         private void LoadData()
  16.         {
  17.             string connectionString = "Data Source=StudentScores.db;Version=3;";
  18.             using (SQLiteConnection connection = new SQLiteConnection(connectionString))
  19.             {
  20.                 connection.Open();
  21.                 string query = "SELECT StudentID, Name, Subject, Score FROM StudentScores";
  22.                 SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, connection);
  23.                 _scoreTable = new DataTable();
  24.                 adapter.Fill(_scoreTable);
  25.                 scoreDataGrid.ItemsSource = _scoreTable.DefaultView;
  26.             }
  27.         }
  28.     }
  29. }
复制代码
步调 2:导出数据到 Excel
实现 ExportScore_Click 方法,用于将数据导出到 Excel 文件。
  1. using OfficeOpenXml;
  2. using Microsoft.Win32;
  3. using System.IO;
  4. namespace StudentScoreApp
  5. {
  6.     public partial class MainWindow : Window
  7.     {
  8.         // 其他代码...
  9.         private void ExportScore_Click(object sender, RoutedEventArgs e)
  10.         {
  11.             if (_scoreTable == null || _scoreTable.Rows.Count == 0)
  12.             {
  13.                 MessageBox.Show("没有数据可导出。");
  14.                 return;
  15.             }
  16.             SaveFileDialog saveFileDialog = new SaveFileDialog
  17.             {
  18.                 Filter = "Excel Files|*.xlsx",
  19.                 Title = "保存为 Excel 文件",
  20.                 FileName = "StudentScores.xlsx"
  21.             };
  22.             if (saveFileDialog.ShowDialog() == true)
  23.             {
  24.                 try
  25.                 {
  26.                     using (ExcelPackage package = new ExcelPackage())
  27.                     {
  28.                         ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Scores");
  29.                         // 将 DataTable 写入 Excel
  30.                         worksheet.Cells["A1"].LoadFromDataTable(_scoreTable, true);
  31.                         // 保存到文件
  32.                         FileInfo fileInfo = new FileInfo(saveFileDialog.FileName);
  33.                         package.SaveAs(fileInfo);
  34.                         MessageBox.Show("成绩已成功导出到 Excel 文件。");
  35.                     }
  36.                 }
  37.                 catch (Exception ex)
  38.                 {
  39.                     MessageBox.Show("导出时发生错误: " + ex.Message);
  40.                 }
  41.             }
  42.         }
  43.     }
  44. }
复制代码
EPPlus  LicenseContext 属性设置

        由于EPPlus 5.0 及以上版本引入了一个贸易答应模式,它须要在代码中明白声明利用的答应上下文。对于大多数非贸易用途,可以将答应上下文设置LicenseContext.NonCommercial。这个非常紧张,如果未设置将会在运行时报错:
  1. 在ExcelPackage package = new ExcelPackage()报错:Please set the ExcelPackage.LicenseContext property. See https://epplussoftware.com/developers/licenseexception
复制代码
须要在代码中设置 ExcelPackage.LicenseContext 属性。这个非常紧张,以下是办理上面标题的代码示例:
  1. // 在您的应用程序入口点,如 Main 方法或者其他初始化代码中执行以下设置
  2. ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 设置为非商业使用
复制代码

关键点分析


  • 数据库毗连:利用 System.Data.SQLite 库举行数据库毗连和数据检索。确保毗连字符串准确,而且数据库文件可访问。
  • 数据绑定:将 DataTable 绑定到 DataGrid 的 ItemsSource,以便在界面上体现数据。
  • EPPlus 导出:利用 EPPlus 库将 DataTable 数据导出到 Excel。利用 LoadFromDataTable 方法可以轻松将表格加载到 Excel 工作表中。
  • 用户体验:利用 SaveFileDialog 答应用户选择生存位置,并提供导出乐成与否的反馈。
通过这些步调,您可以在 WPF 应用步调中实现从数据库读取、体现学天生绩,并可以大概将数据导出到 Excel 文件的功能。这种方法不光简单而且高效,可以大概处置惩罚大多数常见的需求。

二、基于 ClosedXML 库实现WPF导出EXCEL功能

ClosedXML 是一个开源库,用于简化对 Excel 文件的操纵。根据其在 GitHub 上的项目页面及 NuGet 包信息,ClosedXML 是在 MIT 答应下分发的,可以完全免费利用。 利用 ClosedXML 来处置惩罚 Excel 文件是一个相对简单的过程。它创建在 OpenXML SDK 之上,但提供了一个更易于利用的 API。下面是怎样在项目中利用 ClosedXML.Excel 动态库的指南。
安装 ClosedXML

起首,你须要通过 NuGet 包管理器将 ClosedXML 添加到你的项目中。你可以在 Visual Studio 的包管理控制台中利用以下下令:
  1. Install-Package ClosedXML
复制代码
大概在 .NET CLI 中利用:
  1. dotnet add package ClosedXML
复制代码
利用 ClosedXML 创建和操纵 Excel 文件

以下是一个利用 ClosedXML 创建简单 Excel 文件的示例代码。
  1. using System;
  2. using ClosedXML.Excel;
  3. class Program
  4. {
  5.     static void Main()
  6.     {
  7.         // 创建一个新的 Excel 工作簿
  8.         using (var workbook = new XLWorkbook())
  9.         {
  10.             // 添加一个新的工作表
  11.             var worksheet = workbook.Worksheets.Add("Sample Sheet");
  12.             // 插入数据
  13.             worksheet.Cell(1, 1).Value = "Hello";
  14.             worksheet.Cell(1, 2).Value = "World";
  15.             // 应用一些基本格式
  16.             worksheet.Cell(1, 1).Style.Font.Bold = true;
  17.             // 保存到文件
  18.             workbook.SaveAs("Sample.xlsx");
  19.             Console.WriteLine("Excel file created successfully!");
  20.         }
  21.     }
  22. }
复制代码
读取 Excel 文件

ClosedXML 也支持读取 Excel 文件,这里是怎样读取 Excel 文件并输出一些信息的示例:
  1. using System;
  2. using ClosedXML.Excel;
  3. class Program
  4. {
  5.     static void Main()
  6.     {
  7.         // 打开一个现有的 Excel 文件
  8.         using (var workbook = new XLWorkbook("Sample.xlsx"))
  9.         {
  10.             // 获取第一个工作表
  11.             var worksheet = workbook.Worksheet(1);
  12.             // 读取并输出单元格内容
  13.             Console.WriteLine(worksheet.Cell(1, 1).Value); // 输出:Hello
  14.             Console.WriteLine(worksheet.Cell(1, 2).Value); // 输出:World
  15.         }
  16.     }
  17. }
复制代码
常见操纵



  • 添加公式:
    1. worksheet.Cell("C1").FormulaA1 = "=A1 & " " & B1";
    复制代码
  • 格式化单元格:
    1. worksheet.Cell("A1").Style.Font.Bold = true;
    2. worksheet.Cell("A1").Style.Fill.BackgroundColor = XLColor.Cyan;
    复制代码
  • 遍历单元格:
    1. foreach (var cell in worksheet.RangeUsed().Cells())
    2. {
    3.     Console.WriteLine(cell.Address + " - " + cell.Value);
    4. }
    复制代码

留意事项



  • ClosedXML 是基于 OpenXML SDK 的,以是可以处置惩罚 .xlsx 文件格式,而不支持 .xls(旧版 Excel 格式)。
  • 处置惩罚大型文件时要留意内存利用,只管克制在内存中加载过大数据量的 Excel 文件。
        通过这些示例和分析,你应该可以大概开始利用 ClosedXML 来处置惩罚根本的 Excel 操纵。根据需求,你可以探索更多库提供的功能,比如图表处置惩罚、数据透视表等。
利用 ClosedXML 更换 EPPlus 来实现前面导出数据到 Excel 文件的功能, ClosedXML 提供了易于利用的 API。以下是怎样将前面基于 EPPlus 来实现导出数据到 Excel 文件的代码转换为利用 ClosedXML 的版本示例:
  1. using ClosedXML.Excel;
  2. using Microsoft.Win32;
  3. using System.Data;
  4. using System.Windows;
  5. namespace StudentScoreApp
  6. {
  7.     public partial class MainWindow : Window
  8.     {
  9.         // 其他代码...
  10.         private void ExportScore_Click(object sender, RoutedEventArgs e)
  11.         {
  12.             if (_scoreTable == null || _scoreTable.Rows.Count == 0)
  13.             {
  14.                 MessageBox.Show("没有数据可导出。");
  15.                 return;
  16.             }
  17.             SaveFileDialog saveFileDialog = new SaveFileDialog
  18.             {
  19.                 Filter = "Excel Files|*.xlsx",
  20.                 Title = "保存为 Excel 文件",
  21.                 FileName = "StudentScores.xlsx"
  22.             };
  23.             if (saveFileDialog.ShowDialog() == true)
  24.             {
  25.                 try
  26.                 {
  27.                     // 创建一个新的 Excel 工作簿
  28.                     using (var workbook = new XLWorkbook())
  29.                     {
  30.                         // 添加一个新的工作表
  31.                         var worksheet = workbook.Worksheets.Add("Scores");
  32.                         // 使用 DataTable 填充工作表
  33.                         worksheet.Cell(1, 1).InsertTable(_scoreTable);
  34.                         // 保存到文件
  35.                         workbook.SaveAs(saveFileDialog.FileName);
  36.                         MessageBox.Show("成绩已成功导出到 Excel 文件。");
  37.                     }
  38.                 }
  39.                 catch (Exception ex)
  40.                 {
  41.                     MessageBox.Show("导出时发生错误: " + ex.Message);
  42.                 }
  43.             }
  44.         }
  45.     }
  46. }
复制代码
  
  

  • 创建工作簿和工作表:

    • 利用 XLWorkbook 创建一个新的工作簿。
    • 利用 workbook.Worksheets.Add("Scores") 创建一个新的工作表。

  • 插入表格:

    • 利用 worksheet.Cell(1, 1).InsertTable(_scoreTable) 将 DataTable 的内容添加到工作表中。

  • 生存文件:

    • 利用 workbook.SaveAs(saveFileDialog.FileName) 方法生存 Excel 文件。

ClosedXML 的 API 计划为更易于利用,特殊是对于从 DataTable 导出数据的场景。确保你的项目已经通过 NuGet 引入 ClosedXML 包后,你就可以利用这段代码举行 Excel 操纵。
  三、 ClosedXML 与 EPPlus利用场景和优缺点对比

        选择 ClosedXML 和 EPPlus 之间的库来处置惩罚 Excel 文件,取决于你的详细需求和偏好。以下是这两个库的优缺点对比,以资助你做出决定:
ClosedXML

优点:


  • 易于利用:API 计划轻便,利用起来非常直观,恰当快速开辟。
  • 功能全面:支持绝大多数 Excel 的根本功能,比方单元格格式化、图表、表格等。
  • 机动性:支持 Excel 的各种操纵,包罗读取和写入。
  • 开源:基于 MIT 答应证,答应自由利用和修改。
缺点:


  • 性能:在处置惩罚非常大的 Excel 文件时,性能大概不如 EPPlus 高效。
  • 依靠 OpenXML SDK:须要对 OpenXML SDK 有一点相识才气利用全部功能。
EPPlus

优点:


  • 性能高:通常在处置惩罚大型 Excel 文件时更高效。
  • 丰富的功能集:支持高级功能如数据透视表、条件格式化等。
  • 支持最新的 Excel 功能:积极更新以支持最新的 Excel 功能。
缺点:


  • 答应证限定:从版本 5 开始,EPPlus 改为贸易答应,但仍提供 LGPL 答应证供非贸易用途利用。
  • 学习曲线稍陡:对于简单操纵,API 大概不如 ClosedXML 简单直观。

实用场景



  • 选择 ClosedXML:

    • 如果你须要一个简单、易于利用的库来举行快速开辟,特殊是处置惩罚小到中型的 Excel 文件。
    • 恰当初学者和不须要复杂 Excel 操纵的项目。

  • 选择 EPPlus:

    • 如果你须要处置惩罚大型 Excel 文件或须要利用一些高级功能。
    • 实用于须要高性能和贸易支持的企业级应用。

总结

        如果你的项目是小型或中型规模,而且须要快速实现根本的 Excel 操纵,ClosedXML 大概是更符合的选择。如果你须要处置惩罚复杂或大型文件,而且须要最大限度的性能,EPPlus 会是更好的选择。在选择库之前,也可以思量项目的答应证要求和预算。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表