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

目录

引言        

一、基于 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 Type
StudentIDINTEGER
NameTEXT
SubjectTEXT
ScoreREAL

步骤 2:安装 NuGet 包

在项目中安装以下 NuGet 包:

  • System.Data.SQLite:用于连接 SQLite 数据库。(根据实际应用中选择数据库,本文仅以 SQLite 数据库为例)
  • EPPlus:用于导出数据到 Excel。
Install-Package System.Data.SQLite
Install-Package EPPlus

创建 WPF 界面

在 XAML 文件中,创建一个简单的界面,包括一个 DataGrid 和一个导出按钮。

<Window x:Class="StudentScoreApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="学生成绩查询" Height="400" Width="600"><Grid><DataGrid x:Name="scoreDataGrid" AutoGenerateColumns="True" HeadersVisibility="Column" IsReadOnly="True" Margin="10,10,10,50" /><Button Content="导出" Width="100" Height="30" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="10" Click="ExportScore_Click"/></Grid>
</Window>

后端代码

步骤 1:从数据库加载数据

在代码后面,编写从数据库加载数据的方法。

using System;
using System.Data;
using System.Data.SQLite;
using System.Windows;namespace StudentScoreApp
{public partial class MainWindow : Window{private DataTable _scoreTable;public MainWindow(){InitializeComponent();LoadData();}private void LoadData(){string connectionString = "Data Source=StudentScores.db;Version=3;";using (SQLiteConnection connection = new SQLiteConnection(connectionString)){connection.Open();string query = "SELECT StudentID, Name, Subject, Score FROM StudentScores";SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, connection);_scoreTable = new DataTable();adapter.Fill(_scoreTable);scoreDataGrid.ItemsSource = _scoreTable.DefaultView;}}}
}

步骤 2:导出数据到 Excel

实现 ExportScore_Click 方法,用于将数据导出到 Excel 文件。

using OfficeOpenXml;
using Microsoft.Win32;
using System.IO;namespace StudentScoreApp
{public partial class MainWindow : Window{// 其他代码...private void ExportScore_Click(object sender, RoutedEventArgs e){if (_scoreTable == null || _scoreTable.Rows.Count == 0){MessageBox.Show("没有数据可导出。");return;}SaveFileDialog saveFileDialog = new SaveFileDialog{Filter = "Excel Files|*.xlsx",Title = "保存为 Excel 文件",FileName = "StudentScores.xlsx"};if (saveFileDialog.ShowDialog() == true){try{using (ExcelPackage package = new ExcelPackage()){ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Scores");// 将 DataTable 写入 Excelworksheet.Cells["A1"].LoadFromDataTable(_scoreTable, true);// 保存到文件FileInfo fileInfo = new FileInfo(saveFileDialog.FileName);package.SaveAs(fileInfo);MessageBox.Show("成绩已成功导出到 Excel 文件。");}}catch (Exception ex){MessageBox.Show("导出时发生错误: " + ex.Message);}}}}
}

EPPlus  LicenseContext 属性设置

        由于EPPlus 5.0 及以上版本引入了一个商业许可模式,它需要在代码中明确声明使用的许可上下文。对于大多数非商业用途,可以将许可上下文设置LicenseContext.NonCommercial。这个非常重要,如果未设置将会在运行时报错:

在ExcelPackage package = new ExcelPackage()报错:Please set the ExcelPackage.LicenseContext property. See https://epplussoftware.com/developers/licenseexception

需要在代码中设置 ExcelPackage.LicenseContext 属性。这个非常重要,以下是解决上面问题的代码示例:

// 在您的应用程序入口点,如 Main 方法或者其他初始化代码中执行以下设置
ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 设置为非商业使用

关键点说明

  1. 数据库连接:使用 System.Data.SQLite 库进行数据库连接和数据检索。确保连接字符串正确,并且数据库文件可访问。

  2. 数据绑定:将 DataTable 绑定到 DataGridItemsSource,以便在界面上显示数据。

  3. EPPlus 导出:使用 EPPlus 库将 DataTable 数据导出到 Excel。使用 LoadFromDataTable 方法可以轻松将表格加载到 Excel 工作表中。

  4. 用户体验:使用 SaveFileDialog 允许用户选择保存位置,并提供导出成功与否的反馈。

通过这些步骤,您可以在 WPF 应用程序中实现从数据库读取、显示学生成绩,并能够将数据导出到 Excel 文件的功能。这种方法不仅简单而且高效,能够处理大多数常见的需求。

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

ClosedXML 是一个开源库,用于简化对 Excel 文件的操作。根据其在 GitHub 上的项目页面及 NuGet 包信息,ClosedXML 是在 MIT 许可下分发的,可以完全免费使用。 使用 ClosedXML 来处理 Excel 文件是一个相对简单的过程。它建立在 OpenXML SDK 之上,但提供了一个更易于使用的 API。下面是如何在项目中使用 ClosedXML.Excel 动态库的指南。

安装 ClosedXML

首先,你需要通过 NuGet 包管理器将 ClosedXML 添加到你的项目中。你可以在 Visual Studio 的包管理控制台中使用以下命令:

Install-Package ClosedXML

或者在 .NET CLI 中使用:

dotnet add package ClosedXML

使用 ClosedXML 创建和操作 Excel 文件

以下是一个使用 ClosedXML 创建简单 Excel 文件的示例代码。

using System;
using ClosedXML.Excel;class Program
{static void Main(){// 创建一个新的 Excel 工作簿using (var workbook = new XLWorkbook()){// 添加一个新的工作表var worksheet = workbook.Worksheets.Add("Sample Sheet");// 插入数据worksheet.Cell(1, 1).Value = "Hello";worksheet.Cell(1, 2).Value = "World";// 应用一些基本格式worksheet.Cell(1, 1).Style.Font.Bold = true;// 保存到文件workbook.SaveAs("Sample.xlsx");Console.WriteLine("Excel file created successfully!");}}
}

读取 Excel 文件

ClosedXML 也支持读取 Excel 文件,这里是如何读取 Excel 文件并输出一些信息的示例:

using System;
using ClosedXML.Excel;class Program
{static void Main(){// 打开一个现有的 Excel 文件using (var workbook = new XLWorkbook("Sample.xlsx")){// 获取第一个工作表var worksheet = workbook.Worksheet(1);// 读取并输出单元格内容Console.WriteLine(worksheet.Cell(1, 1).Value); // 输出:HelloConsole.WriteLine(worksheet.Cell(1, 2).Value); // 输出:World}}
}

常见操作

  • 添加公式

    worksheet.Cell("C1").FormulaA1 = "=A1 & \" \" & B1";
  • 格式化单元格

    worksheet.Cell("A1").Style.Font.Bold = true;
    worksheet.Cell("A1").Style.Fill.BackgroundColor = XLColor.Cyan;
    
  • 遍历单元格

    foreach (var cell in worksheet.RangeUsed().Cells())
    {Console.WriteLine(cell.Address + " - " + cell.Value);
    }
    

注意事项

  • ClosedXML 是基于 OpenXML SDK 的,所以可以处理 .xlsx 文件格式,而不支持 .xls(旧版 Excel 格式)。
  • 处理大型文件时要注意内存使用,尽量避免在内存中加载过大数据量的 Excel 文件。

        通过这些示例和说明,你应该能够开始使用 ClosedXML 来处理基本的 Excel 操作。根据需求,你可以探索更多库提供的功能,比如图表处理、数据透视表等。

使用 ClosedXML 替代 EPPlus 来实现前面导出数据到 Excel 文件的功能, ClosedXML 提供了易于使用的 API。以下是如何将前面基于 EPPlus 来实现导出数据到 Excel 文件的代码转换为使用 ClosedXML 的版本示例:

using ClosedXML.Excel;
using Microsoft.Win32;
using System.Data;
using System.Windows;namespace StudentScoreApp
{public partial class MainWindow : Window{// 其他代码...private void ExportScore_Click(object sender, RoutedEventArgs e){if (_scoreTable == null || _scoreTable.Rows.Count == 0){MessageBox.Show("没有数据可导出。");return;}SaveFileDialog saveFileDialog = new SaveFileDialog{Filter = "Excel Files|*.xlsx",Title = "保存为 Excel 文件",FileName = "StudentScores.xlsx"};if (saveFileDialog.ShowDialog() == true){try{// 创建一个新的 Excel 工作簿using (var workbook = new XLWorkbook()){// 添加一个新的工作表var worksheet = workbook.Worksheets.Add("Scores");// 使用 DataTable 填充工作表worksheet.Cell(1, 1).InsertTable(_scoreTable);// 保存到文件workbook.SaveAs(saveFileDialog.FileName);MessageBox.Show("成绩已成功导出到 Excel 文件。");}}catch (Exception ex){MessageBox.Show("导出时发生错误: " + ex.Message);}}}}
}

  1. 创建工作簿和工作表

    • 使用 XLWorkbook 创建一个新的工作簿。
    • 使用 workbook.Worksheets.Add("Scores") 创建一个新的工作表。
  2. 插入表格

    • 使用 worksheet.Cell(1, 1).InsertTable(_scoreTable) 将 DataTable 的内容添加到工作表中。
  3. 保存文件

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

ClosedXML 的 API 设计为更易于使用,特别是对于从 DataTable 导出数据的场景。确保你的项目已经通过 NuGet 引入 ClosedXML 包后,你就可以使用这段代码进行 Excel 操作。

三、 ClosedXML 与 EPPlus使用场景和优缺点对比

        选择 ClosedXMLEPPlus 之间的库来处理 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 会是更好的选择。在选择库之前,也可以考虑项目的许可证要求和预算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/479422.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAAS美容美发系统架构解析

随着技术的不断发展&#xff0c;SAAS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;模式在各个行业的应用逐渐深化&#xff0c;美容美发行业也不例外。传统的美容美发店面通常依赖纸质记录、手动操作和复杂的管理流程&#xff0c;而随着SAAS平台的出现&…

[代码随想录Day24打卡] 93.复原IP地址 78.子集 90.子集II

93.复原IP地址 一个合法的IP地址是什么样的&#xff1a; 有3个’.分割得到4个数&#xff0c;每个数第一个数不能是0&#xff0c;不能含有非法字符&#xff0c;不能大于255。 这个是否属于合法IP相当于一个分割问题&#xff0c;把一串字符串分割成4部分&#xff0c;分别判断每…

Java学习笔记--继承方法的重写介绍,重写方法的注意事项,方法重写的使用场景,super和this

目录 一&#xff0c;方法的重写 二&#xff0c;重写方法的注意事项 三&#xff0c;方法重写的使用场景 四&#xff0c;super和this 1.继承中构造方法的特点 2.super和this的具体使用 super的具体使用 this的具体使用 一&#xff0c;方法的重写 1.概述:子类中有一个和父类…

gRPC 双向流(Bidirectional Streaming RPC)的使用方法

gRPC 是一个支持多种语言的高性能 RPC 框架&#xff0c;拥有丰富的 API 来简化服务端和客户端的开发过程。gRPC 支持四种 RPC 类型&#xff1a;Unary RPC、Server Streaming RPC、Client Streaming RPC 和 Bidirectional Streaming RPC。下面是双向流 API 的使用方法。 双向流…

npm install -g@vue/cli报错解决:npm error code ENOENT npm error syscall open

这里写目录标题 报错信息1解决方案 报错信息2解决方案 报错信息1 使用npm install -gvue/cli时&#xff0c;发生报错&#xff0c;报错图片如下&#xff1a; 根据报错信息可以知道&#xff0c;缺少package.json文件。 解决方案 缺什么补什么&#xff0c;这里我们使用命令npm…

【ComfyUI】前景分割ComfyUI-BiRefNet-Hugo (无法选定分割的主体,背景鉴别由模型数据,也叫二分分割,显著性分割)

源码&#xff1a;https://github.com/ZhengPeng7/BiRefNet comfyui插件&#xff1a;https://github.com/MoonHugo/ComfyUI-BiRefNet-Hugo 模型下载地址&#xff1a;https://huggingface.co/ZhengPeng7/BiRefNet 工作流以及相关资源下载&#xff1a;https://pan.baidu.com/s/1-U…

大数据技术之Spark :我快呀~

在 MapReduce 为海量数据的计算服务多年后&#xff0c;随着时代的发展和 Spark 等新技术的出现&#xff0c;它的劣势也慢慢的凸显出来了&#xff1a; 执行速度慢。编程复杂度过高。 先看第一点 2000 年代诞生的 MapReduce &#xff0c;因为计算资源有限&#xff0c;所以 Map…

新160个crackme - 105-royalaccezzcrackme

运行分析 需破解Name和Serial&#xff0c;点击OK没反应 PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找到关键字符串 进行静态分析&#xff0c;逻辑如下&#xff1a;1、Name长度大于4&#xff0c;小于212、fun_1返回值为1 对func_1进行动态调试分…

【RISC-V CPU 专栏 -- 香山处理器介绍】

文章目录 RISC-V 香山处理器介绍雁栖湖处理器南湖处理器RISC-V 香山处理器介绍 相信很多小伙伴对于“香山”都不陌生,它是一款开源RISC-V处理器核,香山的每一代架构,都是采用了湖的名字,第一代架构被命名为雁栖湖,第二代架构则叫做 “南湖”。 “雁栖湖”这款处理器的 R…

远程视频验证如何改变商业安全

如今&#xff0c;商业企业面临着无数的安全挑战。尽管企业的形态和规模各不相同——从餐厅、店面和办公楼到工业地产和购物中心——但诸如入室盗窃、盗窃、破坏和人身攻击等威胁让安全主管时刻保持警惕。 虽然传统的监控摄像头网络帮助组织扩大了其态势感知能力&#xff0c;但…

【TQ2440】02 串口连接进入u-boot

需要收到的板子已经烧写好系统或u-boot&#xff0c;看开机液晶屏底下的四个LED灯有没有亮黄绿色&#xff0c;没有就是还没烧写u-boot&#xff0c;需要先使用Jlink烧写u-boot 进入 uboot 的下载模式&#xff0c;如果从 Nor Flash 启动默认的就是进入 uboot 的下载模式&#xff…

QCommandLinkButton控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

【Vue】Ego商城项目跟做

技术栈 Vue全家桶&#xff1a;Vue VueRouter Vuex Axios ElementUI 依赖安装 网络请求&#xff1a;npm install --save axios --no-fund Element&#xff1a;vue add element 后端相关依赖&#xff1a;npm install --save express cors mysql --no-fund token&#xff1a;np…

python简单算法

冒泡 def boll(lis):i 0while i<len(lis)-1:j 0while j<len(lis)-1-i:if lis[j] > lis[j1]:lis[j],lis[j 1] lis[j1],lis[j]j1i1选择排序 def selct1(lit):i 0while i<len(lit)-1:j i1min1 iwhile j < len(lit):if lit[j] < lit[min1]:min1 jj 1li…

2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现

目录 第一题握手&#xff0c;这个直接从49累加到7即可&#xff0c;没啥难度&#xff0c;后面7个不握手就好了&#xff0c;没啥讲的&#xff0c;(然后第二个题填空好难&#xff0c;嘻嘻不会&#xff09; 第三题.好数​编辑 第四题0R格式 宝石组合 数字接龙 最后一题:拔河 第…

【Docker】常用命令汇总

Docker 是1个开源的应用容器引擎&#xff0c;基于Go 语言并遵从 Apache2.0 协议开源。 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&#xff0c;相…

如何选择最适合企业的ETL解决方案?

在今天的大数据时代&#xff0c;企业的数据管理和处理变得愈发重要。企业也越来越依赖于数据仓库和数据湖来提取、转换和加载&#xff08;ETL&#xff09;关键业务信息。一个高效、灵活的ETL解决方案不仅能提升数据处理能力&#xff0c;还能为企业决策提供有力支持。然而&#…

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks 学习笔记

1 Contributions 混合显式-隐式网络架构&#xff1a;提出了一种 Tri-plane 的3D表征方法&#xff0c;结合显式体素网格与隐式解码器的优点 速度快&#xff0c;内存效率高&#xff1b; 支持高分辨率生成&#xff0c;保持3D表征的灵活性和表达能力。与纯显式或隐式方法相比&#…

第十六届蓝桥杯模拟赛(第一期)-Python

本次模拟赛我认为涉及到的知识点&#xff1a; 分解质因数 Python的datetime库 位运算 简单dp 1、填空题 【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结…

ubuntu 安装 docker 记录

本文假设系统为 Ubuntu&#xff0c;从 16.04 到 24.04&#xff0c;且通过 APT 命令安装。理论上也其他 Debian 系的操作系统。 WSL 也一样。 感觉 Docker 官方在强推 Docker Desktop&#xff0c;搜索 Docker 安装文档&#xff0c;一不小心就被导航到了 Docker Desktop 的安装页…