C# Excel操作类EPPlus

news2024/11/28 6:31:28

摘要


EPPlus 是一个流行的用于操作 Excel 文件的开源库,适用于 C# 和 .NET 环境。它提供了丰富的功能,能够轻松地读取、写入和格式化 Excel 文件,使得在 C# 中进行 Excel 文件处理变得更加简单和高效。EPPlus 不需要安装 Microsoft Office 或 Excel,因为它完全是用 C# 编写的,并且直接操作 Excel 文件的数据。

支持 Excel 文件格式:EPPlus 支持读取和写入 Office Open XML (XLSX) 格式的 Excel 文件,这是 Microsoft Excel 2007 及以后版本的默认文件格式。它不支持旧的二进制格式(XLS)

正文


EPPlus 是在 MIT 许可下发布的开源项目,因此你可以免费使用和修改它,也可以将其用于商业项目。它的源代码也是公开可用的,你可以自由查看和学习其中的实现细节。

Nuget 安装epplus,这里版本选上我基本就是5.0以前的够用了。

图片

Announcement: This is the last version of EPPlus under the LGPL License

EPPlus will from version 5 be licensed under the Polyform Noncommercial 1.0.0 license.

With the new license EPPlus is still free to use in some cases, but will require a commercial license to be used in a commercial business.

More information on the license change on our website

常用方法:

Load:将已有的 Excel 文件加载到 ExcelPackage 对象中。

ExcelPackage package = new ExcelPackage();package.Load(FileInfo file);

Save:保存ExcelPackage对象到文件或流。​​​​​​​

package.SaveAs(FileInfo file);package.SaveAs(Stream stream);

获取值:获取单元格的值。

object value = worksheet.Cells[row, column].Value;
设置值:设置单元格的值。
worksheet.Cells[row, column].Value = value;
常用属性:

获取 ExcelWorkbook 对象,表示工作簿。

ExcelWorkbook workbook = package.Workbook;
工作表:获取工作簿中的工作表集合。
ExcelWorksheets worksheets = workbook.Worksheets;
单元格:获取工作表中的单元格集合。
ExcelRange cells = worksheet.Cells;
值:获取或设置单元格的值。​​​​​​​
object value = cell.Value;cell.Value = value;

地址:获取单元格或范围的地址。

string address = cell.Address;
先做一个导入的例子

图片

导入这样一个全国的省市信息​​​​​​​
private void Import(){    lsvMain.Items.Clear();      string filePath = "./地区.xlsx";
    // 检查文件是否存在    if (!File.Exists(filePath))    {        MessageBox.Show($"文件没有找到{filePath}");        return;    }
    // 使用 EPPlus 打开 Excel 文件    using (var package = new ExcelPackage(new FileInfo(filePath)))    {        // 获取工作表        // 可以用Sheet的索引package.Workbook.Worksheets[0];         // 也可用Sheet名字        ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"]; 
        // 获取工作表的行数和列数,在实际工作中,用户给的excel不规范,        // 可能需要通过固定列数,行数通过某些列为空判断结束        int rowCount = worksheet.Dimension.Rows;        int columnCount = worksheet.Dimension.Columns;
        // 读取数据并显示在控制台上        // 这个因为有行头,从第二行开始        for (int row = 2; row <= rowCount; row++)        {            ListViewItem item = new ListViewItem();            item.Text= worksheet.Cells[row, 1].Value.ToString();            for (int col = 2; col <= columnCount; col++)            {                var cellValue = worksheet.Cells[row, col].Value;                item.SubItems.Add(cellValue==null?"": cellValue.ToString());            }            lsvMain.Items.Add(item);        }    }
    for (int i = 0; i < lsvMain.Columns.Count; i++)    {        lsvMain.Columns[i].Width = -2;//宽度按内容计算    }  }

注:行与列的有效判断是个问题,再有就是行列都是从1开始,不像C#中其它基本是0开始索引。

图片

导出Excel

先修改一下导入,需要将数据保存到List中

在导入时,增加​​​​​​​

areas.Add(new Area{    id = int.Parse(item.Text),    type = int.Parse(item.SubItems[1].Text),    parent_id = int.Parse(item.SubItems[2].Text),    name = item.SubItems[3].Text});

public class Area{    public int id { get; set; }    public int type { get; set; }    public int parent_id { get; set; }    public string name { get; set; }}

private void btnExport_Click(object sender, EventArgs e){    //找出所有省    var provinces = areas.Where(x => x.type == 2);    var citys = from t in provinces                from c in areas                where c.type == 3 && c.parent_id == t.id                select new                {                    province = t.name,                    city = c.name                } into b                group b by new { province = b.province } into g                select new                {                    province = g.Key.province,                    qty = g.Count()                };
    // 使用模板    string templatePath = "./统计城市.xlsx";
    // 找开模板文件    FileInfo templateFile = new FileInfo(templatePath);
    //另存的文件    string strDesFileName = "./" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";    FileInfo desFile = new FileInfo(strDesFileName);
    // 载入到package    using (ExcelPackage package = new ExcelPackage(desFile,templateFile))    {        //找到sheet        ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"];        int row = 2;        foreach (var item in citys.ToList())        {            worksheet.Cells[row, 1].Value = item.province;            worksheet.Cells[row, 2].Value = item.qty;            row++;        }        package.Save();    }}​​​​​​​

图片

注意,导出有几个技巧,一般我们都是有导出模板,而且有可以有一些公式在Excel中,可用worksheet.Calculate(),激活公式。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习基础】Python编程10:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言&#xff0c;它在机器学习领域中的重要性主要体现在以下几个方面&#xff1a; 简洁易学&#xff1a;Python语法简洁清晰&#xff0c;易于学习&#xff0c;使得初学者能够快速上手机器学习项目。 丰富的库支持&#xff1a;Python拥有大量的机…

ChatTTS 开源文本转语音模型本地部署、API使用和搭建WebUI界面(建议收藏)

ChatTTS&#xff08;Chat Text To Speech&#xff09;是专为对话场景设计的文本生成语音(TTS)模型&#xff0c;特别适用于大型语言模型(LLM)助手的对话任务&#xff0c;以及诸如对话式音频和视频介绍等应用。它支持中文和英文&#xff0c;还可以穿插笑声、说话间的停顿、以及语…

不确定性+电动汽车!含高比例新能源和多类型电动汽车的配电网能量管理程序代码!

前言 能源供应的可持续性和清洁性是当今世界共同关注的议题&#xff0c;配电网与可再生能源发电相结合&#xff0c;通过多能互补和梯级利用&#xff0c;在不同时空取长补短&#xff0c;提高能源利用率&#xff0c;减少温室气体排放&#xff0c;是解决能源短缺和环境问题的有效…

MicroPython esp32 连接wifi 配网

整体流程&#xff1a; 1&#xff09;开启STA 和 AP 模式 2&#xff09;扫描周围wifi 保存在 变量 wifi_list&#xff08;后面要用到&#xff09; 3) 尝试STA模式连接Wifi&#xff0c;并查寻状态。 4) 如果STA 无法连网&#xff0c;就用AP模式&#xff0c;创建热点。 5&a…

汇编:宏的使用

汇编语言中的宏是用于定义可重复使用的代码块或指令集合的强大工具。宏通过简化代码编写和提高可读性&#xff0c;使得编写和维护汇编程序更加方便&#xff1b;在 MASM&#xff08;Microsoft Macro Assembler&#xff09;中&#xff0c;宏的定义和使用非常常见。以下是对汇编语…

【GD32F303红枫派使用手册】第十一节 ADC-电源电压单通道ADC检测实验

11.1 实验内容 通过本实验主要学习以下内容&#xff1a; ADC的简介 GD32F303 ADC工作原理 查询方式实现ADC单通道采样 11.2 实验原理 11.2.1 ADC原理 我们知道&#xff0c;自然界中有非常多的模拟信号&#xff0c;比如上一节提到的光照强度&#xff0c;还有其他的例如温…

【网络编程开发】10.UNIX套接字域

10.UNIX套接字域 UNIX域套接字是用于在同一台计算机上运行的进程之间进行通信的一种机制。它与传统基于TCP/IP协议栈的套接字不同&#xff0c;UNIX域套接字操作更为高效&#xff0c;因为它避免了网络层的开销&#xff0c;不涉及网络报头、检验和、顺序号等复杂的网络协议处理过…

系统架构设计师重难点知识脑图

大家都知道现在的软考自从变成机考后,越来越难了,教程上的内容不仅全还细,几乎任何内容都有可能考,出题老师主打一个出其不意,比如2024年5月考试,连UML时序图的片段都考,这 种如果看书的话一般都是一瞟而过,而实际工作中又很少会这么严格的去画片段。 所以对于教程上的…

VB7/64位VB6开发工具office插件开发-twinbasic

全新的VB7&#xff0c;twinbasic&#xff0c;支持64位开发&#xff0c;支持EXCEL插件开发&#xff0c;老外连续3年闭关修练终成正果 官方最新版下载&#xff1a;https://github.com/twinbasic/twinbasic/releases 汉化工具用法&#xff1a;把工具和Lang_Tool目录复制到Twinbasi…

C#操作MySQL从入门到精通(15)——分组数据

前言 我们有时候需要对数据库中查询的数据进行分组,所谓分组就是将相同的数据分为一组,本次测试使用的数据库数据如下: 1、分组 分组使用group by关键词,下面的代码的意思是对查询的结果按照student_age进行分组,student_age相同的划分为同一组 string sql = string.E…

C#操作MySQL从入门到精通(16)——使用子查询

前言: 我们在查询数据的过程中有时候查询的数据不是从数据库中来的,而是从另一个查询的结果来的,这时候就需要使用子查询,本文使用的测试数据如下: 1、子查询 下面的代码就是先查询地址是安徽和广西的学生年龄,然后获取年龄对应的姓名 private void button__SubQuery…

windows环境安装多版本jdk与环境切换

1&#xff1a;JDK官网下载 2&#xff1a;安装目录 3&#xff1a;在系统环境变量新添加JAVA_HOME_8和JAVA_HOME_21 4&#xff1a;设置默认使用jdk21&#xff0c;如果需要切换&#xff0c;就更改JAVA_HOME的变量值 5&#xff1a;在环境变量path添加&#xff0c;%JAVA_HOME%\bin和…

10 -每台机器的进程平均运行时间(高频 SQL 50 题基础版)

10 - 每台机器的进程平均运行时间 -- sum(if(activity_type end,timestamp ,-timestamp )) -- 如果activity_type为“end”,值为timestamp&#xff0c;为“start” 为-timestamp&#xff0c;所有数相加end-start -- count(distinct process_id),获取同一机器有几个进行id -- r…

【MYSQL系列】mysql中text,longtext,mediumtext区别

【MYSQL系列】mysql中text,longtext,mediumtext区别 在MySQL数据库中&#xff0c;TEXT、LONGTEXT和MEDIUMTEXT都是用于存储大量文本数据的字段类型。它们之间的主要区别在于可存储的数据大小和性能方面的差异。本文将探讨这些字段类型的特点、使用场景和一些最佳实践。 TEXT类…

PDF分页处理:技术与实践

引言 在数字化办公和学习中&#xff0c;PDF文件因其便携性和格式稳定性而广受欢迎。然而&#xff0c;处理大型PDF文件时&#xff0c;我们经常需要将其拆分成单独的页面&#xff0c;以便于管理和分享。本文将探讨如何使用Python编程语言和一些流行的库来实现PDF文件的分页处理。…

Langchain 新玩法:LangGraph 赋能 RAG Agent,自适应、自校正、Self-RAG

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

【讯为Linux驱动开发】5.并发与竞争

并发&#xff1a;一个CPU在一个时间片只能执行一个任务&#xff0c;切换速度很快。 并行&#xff1a;双核CPU&#xff0c;真正的同时执行两个任务 并行就是并发的理想情况&#xff0c;统称并发。 【问】Linux在什么情况下产生并发&#xff1f; 1.中断中修改公共资源 2.抢占…

【UML用户指南】-11-对高级结构建模-高级关系

目录 1、依赖&#xff08;dependency&#xff09; 1.1.1、绑定&#xff08;bind&#xff09; 1.1.2、导出&#xff08;derive&#xff09; 1.1.3、允许&#xff08;permit&#xff09; 1.1.4、实例&#xff08;instanceOf&#xff09; 1.1.5、实例化&#xff08;instanti…

【PL理论】(11) F#:标准库之 Set | 标准库之 Map

&#x1f4ad; 写在前面&#xff1a;本章我们将简要的介绍一下 Set 和 Map &#xff08;非常简要&#xff0c;简要至极&#xff09; 目录 0x00 标准库之集合&#xff08;Set&#xff09; 0x01 标准库之 Map 0x00 标准库之集合&#xff08;Set&#xff09; 集合中的元素具有…

【调整堆】(C++ 代码实现 注释详解)

自定义结构体&#xff1a; #define sz 105 typedef struct node{int length;int l[sz]; }SqList; 调整堆的函数&#xff1a; HeapAdjust函数思路说明&#xff1a; //目标&#xff1a;将以s为根的子树调整为大根堆 //具体操作&#xff1a;将路径上比s大的都往上移动,s往下移…