ClosedXML秒速批量写入十万数据到Excel

职场菊菊子 2024-07-03 02:16:51
前言

用VBA或者其他语言通过COM组件写数据到Excel的时候,数据量稍微大一点就会卡顿,很慢。非COM技术操作Excel,一般是通过移植微软公开的OpenXML技术,这种方式不需要执行机上安装有Excel。今天咱们要用到的ClosedXML底层也是使用OpenXML来操作Excel。

ClosedXML简介

ClosedXML是一个免费、开源的.NET库,专为处理Excel文件(.xlsx格式)而设计。它能够在不需要安装Microsoft Office或Open XML SDK的情况下,直接在.NET应用程序中读取、修改和创建Excel文档。ClosedXML的核心优势在于其高性能和易用性,它提供了一系列丰富的方法和属性,使得开发者能够轻松地进行单元格操作、公式计算、图表生成等复杂任务。

测试场景

对比两种写入数据方式:逐个单元格写入,和批量写入。

数据量:两列,每列各10万行

环境:.Net8 + ClosedXML最新版

测试代码

安装上面的测试场景,不难写出下面的测试代码。

using System.Collections;using System.Data;using System.Diagnostics;using ClosedXML;using ClosedXML.Excel;TestClosedXML();TestClosedXML2();////// 逐个单元格写入数据///static void TestClosedXML(){ var wb = new XLWorkbook(); var sht = wb.AddWorksheet("ClosedXML"); var loops = 100000; var sw = Stopwatch.StartNew(); sht.Range("A1").Value = "ID"; for (int i = 1; i <= loops; i++) { sht.Cell(i+1, 1).Value = i; sht.Cell(i+1, 2).Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } wb.SaveAs("ClosedXML.xlsx"); Console.WriteLine($"Loops: {loops}, Elapsed: {sw.Elapsed.TotalMilliseconds/1000}");}////// 批量写入更快///static void TestClosedXML2(){ var wb = new XLWorkbook(); var sht = wb.AddWorksheet("ClosedXML"); var loops = 100000; var sw = Stopwatch.StartNew(); var data = new ArrayList(); sht.Range("A1").Value = "ID"; for (int i = 1; i <= loops; i++) { data.Add(new object[] { i, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }); } sht.Cell("A2").InsertData(data); wb.SaveAs("ClosedXML2.xlsx"); Console.WriteLine($"Loops: {loops}, Elapsed: {sw.Elapsed.TotalMilliseconds / 1000}");}测试结果

经过多次测试,数据量大的情况下,批量写入的性能是逐个单元格写性能的3倍。

0 阅读:0

职场菊菊子

简介:感谢大家的关注