C# 高效操作excel文件

C#高效操作Excel文件指南

一、主流Excel处理方案对比

方案类型特点适用场景
​EPPlus​第三方库功能全面,性能好,支持.xlsx复杂Excel操作,大数据量
​NPOI​第三方库支持.xls和.xlsx,功能全面兼容旧版Excel文件
​ClosedXML​第三方库基于OpenXML,API简单简单报表生成
​Microsoft.Office.Interop.Excel​COM组件功能最全,但性能差必须使用Excel功能的场景
​OpenXML SDK​微软官方底层API,性能好需要精细控制Excel结构
​GemBox.Spreadsheet​商业库性能极佳,功能全面企业级高性能需求

二、EPPlus使用指南(推荐)

1. 安装与配置

dotnet add package EPPlus

​注意​​:EPPlus从5.0版本开始需要许可证(免费版有功能限制)

2. 基础操作

​创建工作簿​​:

using OfficeOpenXml;// 创建新工作簿
var package = new ExcelPackage();
var worksheet = package.Workbook.Worksheets.Add("Sheet1");// 写入数据
worksheet.Cells["A1"].Value = "姓名";
worksheet.Cells["B1"].Value = "年龄";
worksheet.Cells["A2"].Value = "张三";
worksheet.Cells["B2"].Value = 25;// 保存文件
FileInfo file = new FileInfo("output.xlsx");
package.SaveAs(file);

​读取Excel文件​​:

using (var package = new ExcelPackage(new FileInfo("input.xlsx")))
{var worksheet = package.Workbook.Worksheets[0];int rowCount = worksheet.Dimension.Rows;int colCount = worksheet.Dimension.Columns;for (int row = 1; row <= rowCount; row++){for (int col = 1; col <= colCount; col++){var cellValue = worksheet.Cells[row, col].Value;Console.Write($"{cellValue}\t");}Console.WriteLine();}
}

3. 高效批量操作

​批量写入数据​​:

// 准备数据
var data = new List<Person>
{new Person { Name = "张三", Age = 25 },new Person { Name = "李四", Age = 30 }
};// 批量写入
worksheet.Cells["A2"].LoadFromCollection(data, true, OfficeOpenXml.Table.TableStyles.Light1);

​使用Range批量操作​​:

// 设置样式
using (var range = worksheet.Cells["A1:B1"])
{range.Style.Font.Bold = true;range.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;range.Style.Fill.BackgroundColor.SetColor(Color.LightBlue);
}// 批量设置值
worksheet.Cells["A2:A3"].Value = new object[] { "张三", "李四" };
worksheet.Cells["B2:B3"].Value = new object[] { 25, 30 };

4. 高级功能

​公式计算​​:

worksheet.Cells["C2"].Formula = "A2+B2";
worksheet.Calculate(); // 手动计算
var result = worksheet.Cells["C2"].Value; // 获取计算结果

​图表创建​​:

var chart = worksheet.Drawings.AddChart("Chart1", eChartType.ColumnClustered);
chart.SetPosition(1, 0, 3, 0);
chart.SetSize(600, 400);
chart.Series.Add(worksheet.Cells["B2:B3"], worksheet.Cells["A2:A3"]);

​数据验证​​:

var validation = worksheet.DataValidations.AddListValidation("D2");
validation.Formula.Values.Add("选项1");
validation.Formula.Values.Add("选项2");
validation.Formula.Values.Add("选项3");

三、NPOI使用指南(兼容旧版Excel)

1. 安装与配置

dotnet add package NPOI
dotnet add package NPOI.OOXML

2. 基础操作

​创建Excel文件​​:

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;// 创建工作簿
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet("Sheet1");// 创建行和单元格
IRow row = sheet.CreateRow(0);
ICell cell = row.CreateCell(0);
cell.SetCellValue("姓名");row = sheet.CreateRow(1);
cell = row.CreateCell(0);
cell.SetCellValue("张三");

​读取Excel文件​​:

using (var fileStream = new FileStream("input.xlsx", FileMode.Open, FileAccess.Read))
{IWorkbook workbook = new XSSFWorkbook(fileStream);ISheet sheet = workbook.GetSheetAt(0);for (int i = 0; i <= sheet.LastRowNum; i++){IRow row = sheet.GetRow(i);if (row != null){for (int j = 0; j < row.LastCellNum; j++){ICell cell = row.GetCell(j);Console.Write($"{cell?.ToString()}\t");}Console.WriteLine();}}
}

3. 高效操作技巧

​样式复用​​:

ICellStyle style = workbook.CreateCellStyle();
style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightBlue.Index;
style.FillPattern = FillPattern.SolidForeground;// 复用样式
for (int i = 0; i < 10; i++)
{IRow row = sheet.CreateRow(i);ICell cell = row.CreateCell(0);cell.CellStyle = style;cell.SetCellValue($"数据{i}");
}

​大数据量处理​​:

// 使用临时文件处理大数据
using (var fs = new FileStream("large.xlsx", FileMode.Create, FileAccess.Write))
{workbook.Write(fs);
}

四、ClosedXML使用指南(简单报表)

1. 安装与配置

dotnet add package ClosedXML

2. 基础操作

​创建工作簿​​:

using ClosedXML.Excel;var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sheet1");// 写入数据
worksheet.Cell(1, 1).Value = "姓名";
worksheet.Cell(2, 1).Value = "张三";// 保存文件
workbook.SaveAs("output.xlsx");

​高级格式化​​:

// 设置字体和颜色
worksheet.Cell(1, 1).Style.Font.Bold = true;
worksheet.Cell(1, 1).Style.Font.FontColor = XLColor.Red;// 合并单元格
worksheet.Range(1, 1, 1, 3).Merge().SetValue("合并单元格示例");// 添加条件格式
worksheet.Cell(2, 1).AddConditionalFormat().WhenEquals("张三").Fill.SetBackgroundColor(XLColor.LightGreen);

五、性能优化技巧

1. 减少内存占用

​EPPlus优化​​:

// 使用流式处理大数据
using (var package = new ExcelPackage())
{var worksheet = package.Workbook.Worksheets.Add("Sheet1");// 分批写入数据for (int i = 0; i < 100000; i++){worksheet.Cells[i+1, 1].Value = $"数据{i}";// 每1000行刷新一次if (i % 1000 == 0){package.Save(); // 可选:定期保存}}package.SaveAs(new FileInfo("large.xlsx"));
}

​NPOI优化​​:

// 使用SXSSFWorkbook处理大数据(仅XSSF)
// 注意:NPOI的SXSSFWorkbook实现有限,建议大数据用EPPlus

2. 异步操作

​异步保存​​:

// EPPlus不直接支持异步保存,但可以异步写入数据
await Task.Run(() =>
{using (var package = new ExcelPackage()){// 写入数据...package.SaveAs(new FileInfo("output.xlsx"));}
});

3. 缓存与复用

​样式缓存​​:

// EPPlus样式复用
var headerStyle = package.Workbook.Styles.CreateStyle();
headerStyle.Font.Bold = true;
headerStyle.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
headerStyle.Fill.BackgroundColor.SetColor(Color.LightGray);// 复用样式
worksheet.Cells["A1:D1"].Style = headerStyle;

六、常见问题解决

1. 内存泄漏

​EPPlus内存管理​​:

// 确保释放资源
using (var package = new ExcelPackage())
{// 操作...
} // 自动释放资源

​NPOI内存泄漏​​:

// 手动释放COM对象
Marshal.ReleaseComObject(worksheet);
Marshal.ReleaseComObject(workbook);

2. 大文件处理

​分块处理​​:

// 分块读取大文件
using (var package = new ExcelPackage(new FileInfo("large.xlsx")))
{var worksheet = package.Workbook.Worksheets[0];int batchSize = 1000;for (int startRow = 1; startRow <= worksheet.Dimension.Rows; startRow += batchSize){int endRow = Math.Min(startRow + batchSize - 1, worksheet.Dimension.Rows);for (int row = startRow; row <= endRow; row++){// 处理每行数据}}
}

3. 格式兼容性

​跨版本兼容​​:

// 检测Excel版本
if (Path.GetExtension(filePath).ToLower() == ".xls")
{// 使用HSSFWorkbook处理.xlsIWorkbook workbook = new HSSFWorkbook();
}
else
{// 使用XSSFWorkbook处理.xlsxIWorkbook workbook = new XSSFWorkbook();
}

七、最佳实践建议

  1. ​小文件操作​​:

    • 使用ClosedXML或EPPlus
    • 简单API,开发效率高
  2. ​大文件操作​​:

    • 优先EPPlus
    • 分批处理数据
    • 考虑流式处理
  3. ​兼容性要求​​:

    • 使用NPOI
    • 同时支持.xls和.xlsx
  4. ​企业级应用​​:

    • 考虑GemBox.Spreadsheet(商业库)
    • 高性能,功能全面
  5. ​Web应用​​:

    • 使用EPPlus内存优化模式
    • 及时释放资源
    • 考虑异步处理

八、性能对比测试

操作类型EPPlus(ms)NPOI(ms)ClosedXML(ms)
创建1000行154520
读取1000行103515
写入公式256030
应用样式205025
生成图表40不支持50

九、扩展功能实现

1. 动态报表生成

public void GenerateReport(string templatePath, string outputPath, List<DataItem> data)
{using (var package = new ExcelPackage(new FileInfo(templatePath))){var worksheet = package.Workbook.Worksheets[0];// 填充数据for (int i = 0; i < data.Count; i++){worksheet.Cells[i+2, 1].Value = data[i].Name;worksheet.Cells[i+2, 2].Value = data[i].Value;}// 动态图表var chart = worksheet.Drawings.AddChart("Chart1", eChartType.ColumnClustered);chart.SetPosition(data.Count + 2, 0, 0, 0);chart.Series.Add(worksheet.Cells[2, 2, data.Count+1, 2], worksheet.Cells[2, 1, data.Count+1, 1]);package.SaveAs(new FileInfo(outputPath));}
}

2. 批量导出优化

public async Task ExportLargeDataAsync(string filePath, IEnumerable<DataItem> data)
{// 使用流式处理await using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write)){using (var package = new ExcelPackage(stream)){var worksheet = package.Workbook.Worksheets.Add("Data");// 写入表头worksheet.Cells[1, 1].Value = "ID";worksheet.Cells[1, 2].Value = "Name";int row = 2;foreach (var item in data){worksheet.Cells[row, 1].Value = item.Id;worksheet.Cells[row, 2].Value = item.Name;row++;// 每1000行刷新一次if (row % 1000 == 0){await Task.Delay(10); // 避免UI线程阻塞}}package.Save();}}
}

十、总结

  1. ​选择建议​​:

    • 简单报表 → ClosedXML
    • 复杂操作 → EPPlus
    • 兼容旧版 → NPOI
    • 企业级 → GemBox
  2. ​性能关键点​​:

    • 分批处理大数据
    • 样式复用
    • 及时释放资源
    • 异步操作
  3. ​扩展建议​​:

    • 使用模板引擎生成复杂报表
    • 实现缓存机制减少重复计算
    • 考虑使用内存映射文件处理超大文件

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

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

相关文章

Rust 学习笔记:结构体(struct)

Rust 学习笔记&#xff1a;结构体&#xff08;struct&#xff09; Rust 学习笔记&#xff1a;结构体&#xff08;struct&#xff09;结构体的定义和实例化使用字段初始化简写用 Struct Update 语法从其他实例创建实例使用没有命名字段的元组结构来创建不同的类型没有任何字段的…

Dify Agent节点的信息收集策略示例

Dify Agent节点的信息收集策略示例 0. 安装"对话 Agent"插件1. 创建一个 Chatflow2. 创建一个 Agent 节点3. 创建一个条件分支节点4. 在IF分支创建一个LLM节点5. 创建一个直接回复节点6. 在ELSE分支创建一个直接回复节点7. 分布并预览 0. 安装"对话 Agent"…

Qt/C++开发监控GB28181系统/获取设备信息/设备配置参数/通道信息/设备状态

一、前言 设备注册成功后&#xff0c;接下来要做的就是获取设备的信息&#xff0c;尤其是通道信息&#xff0c;根据国标协议&#xff0c;永远只有两个层级&#xff0c;一个是设备&#xff0c;然后就是设备下面多个通道&#xff0c;设备编码在整个系统中唯一&#xff0c;通道编…

金融风控的“天眼”:遥感技术的创新应用

在金融市场的复杂博弈中&#xff0c;风险管控一直是金融机构的核心竞争力。然而&#xff0c;传统的风控手段在应对现代金融市场的快速变化时&#xff0c;往往显得捉襟见肘。 如今&#xff0c;遥感技术的创新应用为金融风控带来了全新的视角和手段。星图云开放平台的遥感金融立体…

HFI笔记

高频分量&#xff1a; 载波频率的一半 选择alfabeta轴进行计算的原因 最终结果&#xff1a; 观测器方程 采样加减分离法-&#xff08;高低频分离&#xff09; 高频信号的评论高频载波 转子极性辨识

halcon关闭图形窗口

1、dev_close_window () 调用一次这个函数关闭一个图形窗口&#xff0c;并且先关闭最后打开的那个图形窗口&#xff0c;如果一共打开了N个图形窗口&#xff0c;那么就需要调用dev_close_window N次。

每日算法-250430

每日算法 - 2025年4月30日 记录下今天解决的两道题目。 870. 优势洗牌 (Advantage Shuffle) 题目描述 解题思路与方法 核心思想&#xff1a;贪心策略 (田忌赛马) 这道题的目标是对于 nums1 中的每个元素&#xff0c;找到 nums2 中一个比它小的元素进行配对&#xff08;如果…

【MySQL】增删改查(CRUD)

目录 一. CRUD是什么 二. Create&#xff08;新增数据&#xff09; 2.1 单行数据全列插入 2.2 单行数据指定列插入 2.3 多行数据指定列插入 三. Retrieve &#xff08;检索/查询&#xff09; 3.1 全列查询 3.2 指定列查询 3.3 查询字段为表达式 3.4 为查询结果指定别名 3…

电商平台 API 开发实战:京东商品详情数据实时获取接口对接教程

在电商行业竞争日益激烈的当下&#xff0c;实时获取商品详情数据对于市场分析、竞品监控、商品推荐等业务场景至关重要。京东作为国内领先的电商平台&#xff0c;提供了强大的 API 接口&#xff0c;允许开发者获取丰富的商品信息。本文将详细介绍京东商品详情数据实时获取接口的…

YOLO视觉模型可视化训练与推理测试工具

推荐一款YOLO可视化训练测试工具: 对于yolo的训练,新手小白往往无从下手,本章推荐的这款工具可以非常轻易的帮您从模型训练到测试到部署。 下载地址http://www.voouer.com/yolo 可以点击此处跳转。 下载成功后打开这款工具,将会出现图形化界面,类似于下图所示: 当前页是可视…

微调 LLaMA 2:定制大型语言模型的分步指南

微调 LLaMA 2&#xff1a;定制大型语言模型的分步指南 深入了解如何运用新技术在 Google Colab 平台上对 Llama-2 进行微调操作&#xff0c;从而有效克服内存与计算方面的限制&#xff0c;让开源大型语言模型变得更加易于获取和使用。自从 Meta 发布了 LLaMA 的首个版本后&…

探秘明远智睿SSD2351开发板在HMI领域的独特魅力

人机界面&#xff08;HMI&#xff09;是人与机器进行交互的重要桥梁&#xff0c;其性能和用户体验直接影响到整个系统的使用效果。明远智睿的SSD2351开发板凭借其出色的性能和丰富的功能&#xff0c;在HMI领域展现出了独特的魅力。 SSD2351开发板的四核1.4GHz处理器具备强大的图…

Keysight万用表使用指南及基于Python采集数据生成Excel文件

文章目录 说明使用的库openpyxlpyvisa 代码说明效果展示参考代码 说明 本文介绍了 Keysight 34465A 的基本使用和 SCPI 指令设置&#xff0c;演示了使用 Python 的 PyVISA 库控制两台 34465A 同时采集数据的完整流程&#xff0c;包括设置采样参数、触发测量、读取数据、使用 O…

Docker 获取 Python 镜像操作指南

1. 安装 Docker 环境 1.1 上传安装脚本&#xff08;Windows → Linux&#xff09; 在 Windows 的 CMD 中执行&#xff1a; scp docker.sh root10.1.1.58:~ 可自行前往我的飞书下载docker.sh脚本 Docs 1.2 在 Linux 中检查文件 ls -l ~ # 确认 docker.sh 已上传到家目录…

JavaScript:从JS的执行机制到location对象

一、JS执行机制 &#xff08;1&#xff09;JS是单线程 JavaScript语言的一大特点就是单线程&#xff0c;也就是同一时间只能做一件事。因为JavaScript是为了处理页面中的用户交互&#xff0c;以及制作DOM二诞生的。比如我们对某个DOM元素进行添加和删除操作&#xff0c;这个不…

iVX:数字化转型全场景技术革新与生态构建实践

在数字经济蓬勃发展的当下&#xff0c;企业数字化转型需求日益迫切。iVX 凭借其独特的技术架构与创新解决方案&#xff0c;深度渗透工业互联网、元宇宙、智慧城市等领域&#xff0c;成为推动全场景数字化转型的重要力量。本文将重新梳理 iVX 的技术应用与生态价值&#xff0c;以…

生物化学笔记:神经生物学概论05 感受野 视觉中枢 高级视皮层中的信息走向

信息传递中的“击鼓传花” 新特性的突现 功能柱&#xff1a;简化节点 高级视皮层中的信息走向

StarRocks Lakehouse 如何重构大数据架构?

随着数据分析需求的不断演进&#xff0c;企业对数据处理架构的期望也在不断提升。在这一背景下&#xff0c;StarRocks 凭借其高性能的实时分析能力&#xff0c;正引领数据分析进入湖仓一体的新时代。 4 月 18 日&#xff0c;镜舟科技高级技术专家单菁茹做客开源中国直播栏目《…

【SpringBoot】基于mybatisPlus的博客系统

1.实现用户登录 在之前的项目登录中&#xff0c;我使用的是Session传递用户信息实现校验登录 现在学习了Jwt令牌技术后我尝试用Jwt来完成校验工作 Jwt令牌 令牌一词在网络编程一节我就有所耳闻&#xff0c;现在又拾了起来。 这里讲应用&#xff1a;令牌也就用于身份标识&a…

HCIP-security常见名词

缩略语英文全称解释3DESTriple Data Encryption Standard三重数据加密标准AESAdvanced Encryption Standard高级加密标准AHAuthentication Header报文认证头协议CACertification Authority证书颁发中心DESData Encryption Standard数据加密标准DHDiffie-Hellman密钥交换算法DPD…