ClosedXML

一、类库介绍

ClosedXML是一个用于读取、操作和写入Excel 2007+ (.xlsx, .xlsm)文件的.NET第三方库。它基于OpenXML,但与OpenXML相比,ClosedXML具有更高的性能和更易于使用的API接口。

ClosedXML支持XML文档的解析和生成,可以处理复杂的XML结构。同时,它还提供了丰富的API,可以方便地进行XML文档的查询、修改、添加和删除操作。此外,ClosedXML还支持XPath和XSLT查询,可以进行高效的XML数据检索和转换。

在使用ClosedXML时,您需要将ClosedXML.dll添加到您的项目中,并使用相关的API进行Excel文件的读取和写入。ClosedXML支持多种数据类型,包括字符串、数字、日期、布尔值等,并支持单元格格式设置。此外,您还可以使用ClosedXML进行样式设置,包括字体、边框、颜色等。

除了基本的Excel文件操作,ClosedXML还支持图表、公式、数据验证、条件格式等高级功能。同时,ClosedXML还提供了多种异常处理机制,可以帮助您更好地处理异常情况。

官网:

https://docs.closedxml.io/en/latest/

https://github.com/ClosedXML/ClosedXML

二、安装方式

2.1 直接nuget搜索安装

2.2 命令行安装方式

工具→Nuget包管理器→程序包管理器控制台

输入如下命令:

代码语言:javascript

复制

Install-Package ClosedXML

三、性能测试

3.1 保存性能

3.2 读取性能

四、测试案例

4.1 直接插入DataTable

代码语言:javascript

复制

  /// <summary>
        /// 插入DataTable
        /// </summary>
        private static void InsertDataTable()
        {
            // 创建一个新的 DataTable 对象
            DataTable dataTable = new DataTable();

            // 定义表的列
            dataTable.Columns.Add("ID", typeof(int));
            dataTable.Columns.Add("Name", typeof(string));
            dataTable.Columns.Add("Age", typeof(int));

            // 添加数据行
            dataTable.Rows.Add(1, "John", 25);
            dataTable.Rows.Add(2, "Alice", 30);
            dataTable.Rows.Add(3, "Bob", 40);
            using (var workbook = new XLWorkbook())
            {
                var worksheet = workbook.Worksheets.Add("Sheet1");
                worksheet.FirstCell().InsertTable(dataTable);
                workbook.SaveAs("D:\\tableDemo.xlsx");
            }

        }

4.2 直接插入list

代码语言:javascript

复制

   /// <summary>
        /// 插入list
        /// </summary>
        private static void InsertList()
        {

            List<UserInfo> list = new List<UserInfo>();
            list.Add(new UserInfo
            {
                name = "小明",
                age = 30,
                address = "北京"
            });
            list.Add(new UserInfo
            {
                name = "小李",
                age = 20,
                address = "郑州"
            });
            list.Add(new UserInfo
            {
                name = "小强",
                age = 26,
                address = "上海"
            });
            using (var workbook = new XLWorkbook())
            {
                var worksheet = workbook.Worksheets.Add("Sheet1");
                // 设置列头
                worksheet.Cell("A1").Value = "姓名";
                worksheet.Cell("A1").Style.Font.Bold = true;
                worksheet.Cell("A1").Style.Fill.SetBackgroundColor(XLColor.Gray);
                worksheet.Cell("B1").Value = "年龄";
                worksheet.Cell("B1").Style.Font.Bold = true;
                worksheet.Cell("B1").Style.Fill.SetBackgroundColor(XLColor.Gray);
                worksheet.Cell("C1").Value = "地址";
                worksheet.Cell("C1").Style.Font.Bold = true;
                worksheet.Cell("C1").Style.Fill.SetBackgroundColor(XLColor.Gray);
                var table = worksheet.Cell("A2").InsertData(list);
                workbook.SaveAs("D:\\listDemo.xlsx");
            }

        }

4.3 添加图片

代码语言:javascript

复制

        /// <summary>
        /// 插入图片
        /// </summary>
        private static void InsertImage()
        {
            using (var workbook = new XLWorkbook())
            {
                var worksheet = workbook.Worksheets.Add("Sheet1");
                worksheet.AddPicture("D:\\1.png") .MoveTo(worksheet.Cell(1, 1));            
                workbook.SaveAs("D:\\imageDemo.xlsx");
            }
        }

4.4 大批量导出

代码语言:javascript

复制

 /// <summary>
        /// 大批量插入list 20万条记录时间5.9秒
        /// </summary>
        private static void BatchInsertList()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            List<UserInfo> list = new List<UserInfo>();
            for (int i = 0; i < 200000; i++)
            {
                list.Add(new UserInfo
                {
                    name = "小明"+i,
                    age = 30,
                    address = "北京"
                });
            }        
            using (var workbook = new XLWorkbook())
            {
                var worksheet = workbook.Worksheets.Add("Sheet1");
                // 设置列头
                worksheet.Cell("A1").Value = "姓名";
                worksheet.Cell("A1").Style.Font.Bold = true;
                worksheet.Cell("A1").Style.Fill.SetBackgroundColor(XLColor.Gray);
                worksheet.Cell("B1").Value = "年龄";
                worksheet.Cell("B1").Style.Font.Bold = true;
                worksheet.Cell("B1").Style.Fill.SetBackgroundColor(XLColor.Gray);
                worksheet.Cell("C1").Value = "地址";
                worksheet.Cell("C1").Style.Font.Bold = true;
                worksheet.Cell("C1").Style.Fill.SetBackgroundColor(XLColor.Gray);
                var table = worksheet.Cell("A2").InsertData(list);
                workbook.SaveAs("D:\\batchListDemo.xlsx");
            }
            stopwatch.Stop();
            // 获取代码执行时间
            TimeSpan elapsedTime = stopwatch.Elapsed;

            // 输出执行时间
            Console.WriteLine("10万条数据导出执行时间: {0}", elapsedTime.TotalSeconds+" 秒");
            Console.ReadKey(); 
        }

五、总结

总之,ClosedXML是一个功能强大、易于使用、性能优越的.NET Excel库,适用于各种Excel应用程序的开发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序员如何高效读代码?

程序员高效读代码的技巧包括以下几点&#xff1a; 明确阅读目的&#xff1a;在开始阅读代码之前&#xff0c;先明确你的阅读目的。是为了理解整个系统的架构&#xff1f;还是为了修复一个具体的bug&#xff1f;或者是为了了解某个功能是如何实现的&#xff1f;明确目的可以帮助…

系统安全设计规范(Word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 资料获取&#xff1a;私信或者进主页。…

示例:WPF中推荐一个支持折叠展开的GridSpliter自定义控件GridSplitterBox

一、目的&#xff1a;推荐一个支持折叠展开的GridSpliter自定义控件GridSplitterBox 二、效果 实现功能&#xff1a;设置菜单显示位置&#xff0c;最小宽度&#xff0c;最大宽度&#xff0c;位置持久化保存 三、环境 VS2022 Net7 四、使用方式 1、安装nuget包&#xff1a;H…

能理解你的意图的自动化采集工具——AI和爬虫相结合

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

pytest测试框架flaky插件重试失败用例

Pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍下插件flaky &#xff0c;用于在测试用例失败时自动重新运行这些测试用例。与前面文章介绍的插件pytest-rerunfailures功能有些类似&#xff0c;但是功能上不如pytest-rerunfailures插件丰富。 flaky官方并没有明确pyt…

中国企业数字化转型现状、趋势和挑战

一、来自不同行业、不同所有制的145家企业的调查 为了了解中国企业数字化转型的现状、趋势和挑战&#xff0c;2022年我们完成了一次在线问卷调查。 受访企业达145家&#xff0c;国内企业111家&#xff0c;占比77%&#xff08;其中央企占总比例51%&#xff09;&#xff0c;民营…

【Python机器学习】k均值聚类——矢量量化,或者将k均值看作分解

虽然k均值是一种聚类算法&#xff0c;但在k均值和分解方法之间存在一些相似之处。k均值尝试利用簇中心来表示每个数据点&#xff0c;可以看作仅用一个分量来表示每个数据点&#xff0c;该分量由簇中心给出。这种观点将k均值看作是一种分解方法&#xff0c;其中每个点用单一分量…

【计算机组成原理】部分题目汇总

计算机组成原理 部分题目汇总 一. 简答题 RISC和CICS 简要说明&#xff0c;比较异同 RISC&#xff08;精简指令集&#xff09;注重简单快速的指令执行&#xff0c;使用少量通用寄存器&#xff0c;固定长度指令&#xff0c;优化硬件性能&#xff0c;依赖软件&#xff08;如编译…

Adobe Acrobat 编辑器软件下载安装,Acrobat 轻松编辑和管理各种PDF文件

Adobe Acrobat&#xff0c;它凭借卓越的功能和丰富的工具&#xff0c;为用户提供了一个全面的解决方案&#xff0c;用于查看、创建、编辑和管理各种PDF文件。 作为一款专业的PDF阅读器&#xff0c;Adobe Acrobat能够轻松打开并展示各种格式的PDF文档&#xff0c;无论是文字、图…

软考初级网络管理员__软件单选题

1.在Excel 中&#xff0c;设单元格F1的值为56.323&#xff0c;若在单元格F2中输入公式"TEXT(F1,"&#xffe5;0.00”)”&#xff0c;则单元格F2的值为()。 &#xffe5;56 &#xffe5;56.323 &#xffe5;56.32 &#xffe5;56.00 2.要使Word 能自动提醒英文单…

前沿技术丨S2S自动化测试解决方案

技术背景 随着面向服务的架构&#xff08;Service-Oriented Architecture&#xff0c;SOA&#xff09;在整车架构中的逐步推进及应用&#xff0c;车内网络通信中会一直并存基于以太网的面向服务和基于传统网络的面向信号的两类控制器&#xff0c;S2S&#xff08;Signal to Ser…

USB - USB在消费领域的应用

Switching in USB Consumer Applications 通用串行总线&#xff08;USB&#xff09;已成为满足终端设备之间日益增长的快速数据传输需求的主流接口--例如&#xff0c;在个人电脑和便携式设备&#xff08;如手机、数码相机和个人媒体播放器&#xff09;之间下载和上传数据。 The…

如何与情绪好好相处,真正成为情绪的主人

一、教程描述 若要成为一个聪明的人&#xff0c;就要学会做情绪的主人&#xff0c;而不是被情绪控制自己&#xff0c;为什么要做情绪的主人&#xff1f;至少有以下两个方面原因。 其一&#xff0c;都说&#xff0c;世上还是好人多。可是&#xff0c;为什么你身边没有一个好人…

npm 安装踩坑

1 网络正常&#xff0c;但是以前的老项目安装依赖一直卡住无法安装&#xff1f;哪怕切换成淘宝镜像 解决办法&#xff1a;切换成yarn (1) npm i yarn -g(2) yarn init(3) yarn install在安装的过程中发现&#xff1a; [2/4] Fetching packages... error marked11.1.0:…

android 彩虹进度条自定义view实现

实现一个彩虹色进度条功能&#xff0c;不说明具体用途大家应该能猜到。想找别人造的轮子&#xff0c;但是没有合适的&#xff0c;所以决定自己实现一个。 相关知识 android 自定义view LinearGradient 线性渐变 实现步骤 自定义view 自定义一个TmcView类继承View 重写两…

单体服务系统认证

上一节讲了如何使用JWT生成令牌&#xff0c;下面说说单体服务认证基本流程。 认证流程 流程图&#xff1a; 流程描述&#xff1a; 用户输入登录信息&#xff0c;客户端&#xff08;Web/APP等&#xff09;发起登录请求&#xff1b;服务端校验该用户是否有效&#xff0c;用户…

批量重命名神器揭秘:一键实现文件夹随机命名,自定义长度轻松搞定!

在数字化时代&#xff0c;我们经常需要管理大量的文件夹&#xff0c;尤其是对于那些需要频繁更改或整理的文件来说&#xff0c;给它们进行批量重命名可以大大提高工作效率。然而&#xff0c;传统的重命名方法既繁琐又耗时&#xff0c;无法满足高效工作的需求。今天&#xff0c;…

【05】数据模型和工作量证明-简单的区块链模型

1. 简单的区块链模型 每一个区块都保存了签一个区块的hash值,这样多个区块就可以形成一个有序的后向连接的列表。 如果,区块链中的某1区块的数据被篡改,那么该区块的hash值会被改变,那么致使由该“错误区块”引导的子链失效(不被认可),从而从结构上保证了数据的可靠性、…

视频AI分析定时任务思路解析

序言&#xff1a; 最近项目中用到视频ai分析&#xff0c;由于sdk涉及保密&#xff0c;不便透露&#xff0c;仅对定时任务分析的思路作出分享&#xff0c;仅供参考。 1、定时任务 由于ai服务器的性能上限&#xff0c;只能同时对64个rtsp流分析一种算法&#xff0c;或者对8个rts…

累了就坐下来喝杯茶 然后继续前行

前言&#xff1a; 今天是情人节就不发技术文章了 先祝愿各位有情人总成眷属。也包括我&#xff0c;哈哈哈 今天要分享的是一个diy制作的教程 因为我女朋友不在这边&#xff0c;心中那份思念难耐 所以有感而发 写了这篇diy 教程的文章 效果图&#xff1a; 需要的材料 502胶水…