.NET平台用C#通过字节流动态操作Excel文件
在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据。这种方法允许开发者直接在内存中创建、修改和保存Excel文档,无需依赖直接的文件储存、读取操作,从而提高了程序的性能和安全性。使用流技术处理Excel不仅简化了数据操作流程,还支持更简便的并发处理和临时数据管理,使应用程序能够更好地适应各种数据处理需求。本文将演示如何在.NET平台使用C#通过字节流创建、读取、编辑及保存Excel文件。
文章目录
- 用C#创建并保存Excel工作簿为字节流
- 用C#通过字节流直接读取Excel文件数据
- 用C#通过字节流编辑Excel工作簿
本文所使用的方法需要用到免费的Free Spire.XLS for .NET,NuGet:Install-Package FreeSpire.XLS。
用C#创建并保存Excel工作簿为字节流
我们可以通过创建Workbook实例直接创建Excel工作簿,然后在其中添加数据及设置格式,最后使用Workbook.SaveToStream()方法将其保存为字节流。注意新建的Excel工作簿包含三个默认的工作表。以下是操作步骤示例:
- 创建
Workbook实例。 - 通过
Workbook.Worksheets[]属性访问工作簿。 - 定义或读取用于制作表格数据,如使用
DataTable创建一个数据表。 - 使用
Workbook.InsertDataTable()插入数据到工作表中,或通过Worksheet.Range[].Value属性直接为单元格添加数据。 - 通过
CellRange.Style中的属性为单元格设置格式。 - 使用
Worksheet.AutoFitColumn()方法自动调整列宽。 - 使用
Workbook.SaveToStream()方法将Excel工作簿保存到新建的字节流或已有的字节流。
代码示例
using Spire.Xls;
using System.Data;
using System.Drawing;namespace CreateExcelStream
{class Program{static void Main(string[] args){// 创建一个新的工作簿实例Workbook workbook = new Workbook();// 获取工作簿中的第一个工作表Worksheet sheet = workbook.Worksheets[0];// 创建并填充一个包含示例数据的 DataTableDataTable table = new DataTable("员工信息");table.Columns.Add("ID", typeof(int));table.Columns.Add("姓名", typeof(string));table.Columns.Add("性别", typeof(string));table.Columns.Add("职位", typeof(string));table.Columns.Add("部门", typeof(string));table.Columns.Add("工资", typeof(decimal));table.Columns.Add("入职日期", typeof(DateTime));table.Rows.Add(1, "张伟", "男", "软件工程师", "研发部", 75000, DateTime.Parse("2020-03-15"));table.Rows.Add(2, "李娜", "女", "项目经理", "项目管理办公室", 85000, DateTime.Parse("2019-06-22"));table.Rows.Add(3, "王芳", "女", "用户体验设计师", "设计部", 70000, DateTime.Parse("2021-04-05"));table.Rows.Add(4, "赵强", "男", "系统分析师", "信息技术部", 80000, DateTime.Parse("2018-07-11"));table.Rows.Add(5, "孙丽", "女", "市场营销专员", "市场部", 60000, DateTime.Parse("2022-01-03"));table.Rows.Add(6, "周勇", "男", "销售代表", "销售部", 65000, DateTime.Parse("2020-09-10"));table.Rows.Add(7, "吴敏", "女", "财务会计", "财务部", 72000, DateTime.Parse("2017-11-28"));table.Rows.Add(8, "郑涛", "男", "人力资源经理", "人力资源部", 82000, DateTime.Parse("2016-05-18"));table.Rows.Add(9, "冯静", "女", "法律顾问", "法务部", 90000, DateTime.Parse("2015-02-14"));table.Rows.Add(10, "陈浩", "男", "首席执行官", "高层管理", 120000, DateTime.Parse("2014-08-01"));// 将 DataTable 中的数据插入到工作表中sheet.InsertDataTable(table, true, 1, 1);// 格式化工作表// 设置表头行的样式sheet.Rows[0].Style.Color = Color.FromArgb(229, 243, 251);sheet.Rows[0].Style.Font.FontName = "宋体";sheet.Rows[0].Style.Font.Size = 14f;sheet.Rows[0].BorderAround(); // 给表头行添加外边框sheet.Rows[0].Borders.Color = Color.FromArgb(180, 180, 180); // 设置边框颜色// 设置数据行的样式for (int i = 1; i < sheet.AllocatedRange.Rows.Count(); i++){sheet.Rows[i].Style.Color = Color.FromArgb(247, 252, 255);sheet.Rows[i].Style.Font.FontName = "宋体";sheet.Rows[i].Style.Font.Size = 12f;// 更改偶数行背景色if ((i + 1) %2 == 0){sheet.Rows[i].Style.Color = Color.FromArgb(255, 255, 255);}}sheet.Range[2, 1, sheet.Rows.Count(), sheet.Columns.Count()].BorderInside(); // 添加数据行单元格内边框sheet.Range[2, 1, sheet.Rows.Count(), sheet.Columns.Count()].Borders.Color = Color.FromArgb(220, 220, 220); // 设置边框颜色// 调整列宽以适应内容for (int j = 1; j <= sheet.AllocatedRange.Columns.Count(); j++){sheet.AutoFitColumn(j);}// 将工作簿保存到内存流MemoryStream stream = new MemoryStream();workbook.SaveToStream(stream, FileFormat.Version2016);// 将流内容写入到文件File.WriteAllBytes("output/通过流创建Excel文件.xlsx", stream.ToArray());// 释放资源workbook.Dispose();}}
}
结果

用C#通过字节流直接读取Excel文件数据
我们可以使用Workbook.LoadFromStream()将Excel文件流载入到Workbook实例,然后使用Workbook.Worksheets[]属性访问工作表以及Worksheet.Range[].Value属性访问单元格数据,从而直接读取其数据用于进行进一步操作。以下是操作步骤示例:
- 创建
Workbook实例。 - 使用
Workbook.LoadFromStream()方法从新建的字节流或已有的字节流载入Excel工作簿。 - 通过
Workbook.Worksheets[]属性访问指定工作表。 - 遍历工作表已使用的单元格范围的行和列,通过
Worksheet.Range[].Value属性获取单元格数据。 - 输出获取到的数据,或将数据用于其他操作。
代码示例
using Spire.Xls;namespace LoadExcelStream
{class Program{static void Main(string[] args){// 创建一个 Workbook 类的实例Workbook workbook = new Workbook();// 创建一个内存流MemoryStream stream = new MemoryStream();File.OpenRead("output/通过流创建Excel文件.xlsx").CopyTo(stream);// 从内存流加载 Excel 文件workbook.LoadFromStream(stream);// 获取工作簿中的第一个工作表Worksheet sheet = workbook.Worksheets[0];// 初始化一个列表,用于存储从工作表中提取的数据List<List<string>> data = new List<List<string>>();for (int i = 0; i < sheet.AllocatedRange.Rows.Count(); i++){// 创建一个列表来存储每行数据List<string> lines = new List<string>();for (int j = 0; j < sheet.AllocatedRange.Columns.Count(); j++){// 获取单元格的值并添加到当前行的列表中lines.Add(sheet.AllocatedRange[i + 1, j + 1].Value);}// 将当前行的数据添加到数据列表中data.Add(lines);}// 打印提取的数据,或将其用于后续操作foreach (List<string> lines in data){Console.WriteLine(string.Join(" | ", lines));}}}
}
结果

用C#通过字节流编辑Excel工作簿
通过使用Workbook的LoadFromStream方法,我们可以从字节流载入Excel工作簿,然后再使用库中的其他方法和属性对工作簿内容进行编辑。在完成编辑后,再使用SaveToStream方法将工作簿保存回字节流,就可以实现只通过字节流对Excel文件进行编辑操作。以下是操作步骤示例:
- 创建
Workbook实例。 - 使用
Workbook.LoadFromStream()方法从新建的字节流或已有的字节流载入Excel工作簿。 - 通过
Workbook.Worksheets[]属性访问指定工作表。 - 通过
CellRange的Style、Value等属性对单元格或单元格范围进行编辑。 - 使用使用
Workbook.SaveToStream()方法将Excel工作簿保存回字节流。 - 释放资源。
代码示例
using Spire.Xls;
using System.Drawing;namespace ModifyExcelStream
{class Program{static void Main(string[] args){// 创建 Workbook 类的一个新实例Workbook workbook = new Workbook();// 创建一个内存流MemoryStream stream = new MemoryStream();File.OpenRead("output/通过流创建Excel文件.xlsx").CopyTo(stream);// 从内存流加载 Excel 文件workbook.LoadFromStream(stream);// 获取工作簿中的第一个工作表Worksheet sheet = workbook.Worksheets[0];// 修改表头行的样式CellRange headerRow = sheet.AllocatedRange.Rows[0];headerRow.Style.Font.FontName = "黑体";headerRow.Style.Font.Size = 12f;headerRow.Style.Color = Color.FromArgb(108, 91, 123);headerRow.Borders.Color = Color.FromArgb(255, 255, 255);// 修改数据行的样式for (int i = 1; i < sheet.AllocatedRange.Rows.Count(); i++){CellRange dataRow = sheet.AllocatedRange.Rows[i];dataRow.Style.Font.FontName = "黑体";dataRow.Style.Font.Size = 10f;dataRow.Style.Color = Color.FromArgb(255, 204, 128);dataRow.Borders.Color = Color.FromArgb(158, 158, 158);// 更改着色(偶数行)if (i % 2 == 0){dataRow.Style.Color = Color.FromArgb(129, 222, 227);}}// 自动调整列宽以适应内容for (int k = 1; k <= sheet.AllocatedRange.Columns.Count(); k++){sheet.AutoFitColumn(k);}// 修改边框颜色sheet.AllocatedRange.Style.Borders.Color = Color.White;// 将修改后的工作簿保存回内存流workbook.SaveToStream(stream);// 将流内容写入到一个新文件File.WriteAllBytes("output/通过流修改Excel文件.xlsx", stream.ToArray());// 释放资源workbook.Dispose();}}
}
结果

本文演示了如何在.NET平台使用C#通过字节流创建、读取、编辑及保存Excel工作簿。
相关文章:
.NET平台用C#通过字节流动态操作Excel文件
在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据。这种方法允许开发者直接在内存中创建、修改和保存Excel文档,无需依赖直接的文件储存、读取操作,从而提高了程序的性能和安全性。使用流技术处理Excel不仅简化了…...
SpringMVC详解
文章目录 1 什么是MVC 1.1 MVC设计思想1.2 Spring MVC 2 SpringMVC快速入门3 SpringMVC处理请求 3.1 请求分类及处理方式 3.1.1 静态请求3.1.2 动态请求 3.2 处理静态请求 3.2.1 处理html文件请求3.2.2 处理图片等请求 3.3 处理动态请求 3.3.1 注解说明3.3.2 示例 3.4 常见问题…...
springboot、spring、springmvc有哪些注解
Spring Boot 常用注解 虽然Spring Boot本身并没有引入大量新的注解,但它基于Spring框架,并整合了多种技术和库,使得开发者可以更方便地使用Spring框架的功能。在Spring Boot项目中,常用的注解主要来自于Spring框架本身。 Sprin…...
Apache Commons ThreadUtils 的使用与优化
Apache Commons ThreadUtils 的使用与优化 1. 问题背景 在 Java 系统中,跨系统接口调用通常需要高并发支持,尤其是线程池的合理配置至关重要。如果线程池使用不当,可能导致性能下降,线程等待或过载。 当前问题 使用了 Apache …...
重温设计模式--5、职责链模式
文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍 定义与概念 职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它旨在将请求的发送者和多个接收者解耦,让多个对象都有机会处理请求&am…...
下午四点半
客户的员工竟然背着公司开发报表系统,是在密谋什么大事吗? 之前去线下给客户的员工培训,当时我就对这个小姑娘印象很深刻,因为她后面加了我们的技术人员,问了很多问题,不同于从来没有用过低代码平台的人&a…...
嵌入式单片机中Flash存储器控制与实现
第一:嵌入式单片机内部Flash概述 1.存储器的概念 存储器指的是若干个存储单元的集合,每个存储单元都可以存储若干个二进制数,为了方便的操作存储单元,就为每个存储单元都分配了地址,就可以通过寻址来访问存储单元。由于计算机的处理的数据量较大,并且运算速度都很快,就…...
loki failed to flush
loki 报错 levelerror ts2024-12-27T08:13:10.450140686Z callerflush.go:143 org_idfake msg"failed to flush" err"failed to flush chunks: store put chunk: open /data/loki/chunks/ZmFrZS85ODBmM2U3NzliODg2MjY1OjE5M2VhNDVkYTc4OjE5M2VhNDVlNDdkOjVmMjA…...
微信小程序打印生产环境日志
微信小程序打印生产环境日志 新建一个log.js文件,写入以下代码: let log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.i…...
利用 deepin-IDE 的 AI 能力,我实现了文件加密扩展
经过多轮迭代,deepin 文件管理器(dde-file-manager)的扩展功能已经趋于稳定,看到越来越丰富的文管新功能,作为一名技术爱好者,也想自己动手写个插件扩展一下文管的功能。 我选择的开发工具是 deepin-IDE&a…...
JPA 基本查询(五)
JPA 查询Exists示例 JPA教程 - JPA 查询Exists示例 如果子查询返回任何行,则EXISTS条件返回true。 以下代码显示如何在JPQL中使用带有子查询的EXISTS运算符。 List l em.createQuery("SELECT e FROM Professor e WHERE EXISTS " "(SELECT p FROM …...
hiprint结合vue2项目实现静默打印详细使用步骤
代码地址是:vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址:electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm(socket.…...
项目报 OutOfMemoryError 、GC overhead limit exceeded 问题排查以及解决思路实战
项目报 OutOfMemoryError、GC overhead limit exceeded 问题排查以及解决思路实战 前言: 问题现象描述: 1,生产环境有个定时任务,没有初始化告警数据【告警数据量为1000多个】 2,其他定时任务执行正常 3,查…...
【计算机-显示屏灰阶测试】
硬计算机-显示屏灰阶测试 ■ 对比度■ 清晰度■ 灰度色阶(色带)■ 对比率■■ ■ 对比度 在一个性能良好的显示器上,您可观察到每种颜色的标尺都可分为从 1 至 32、大致上等宽但不同亮度的色带。即使是在刻度1处的色带也应该隐约可见。 一个…...
CSS系列(40)-- Container Queries详解
前端技术探索系列:CSS Container Queries详解 📦 致读者:探索组件响应式的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Container Queries,这个强大的组件级响应式特性。 基础概念 🚀 容…...
工作生活做事慢效率低原因及解决方案
时间和效率管理具体版(初阶)(一) 工作&生活做事慢效率低原因及解决方案 一、效率慢的原因(动物解析法(编者自创)) 打败你的可能是生活的小事 1.无头苍蝇无流程 做事之前没有想…...
各种数据库类型介绍
在软件开发和数据处理领域,数据库扮演着至关重要的角色。它们用于存储、检索和管理大量数据,是信息系统不可或缺的基础。以下是几种常用的数据库类型及其简要介绍: 1.关系型数据库(Relational Databases) 关系型数据库…...
了解智能运维
智能运维 (一)运维工作的转变 随着技术发展,运维工作从基础的搬机器、插网线、装系统等体力活儿,逐渐转变为更侧重服务器管理、代码管理、日志分析、监控告警、流量管理及故障排查等的脑力劳动。如今,运维人员拿到的…...
js实现仿windows文件名称排序
引言: 在JavaScript中,数组排序是一个常见的操作,但默认的Array.sort()方法只能进行简单的字符串比较。在处理复杂数据时,我们需要自定义排序函数来满足特定的需求。本文将通过一个具体的代码示例,解释如何实现一个仿w…...
基于Oauth2的SSO单点登录---前端
Vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统框架,提供了丰富的组件和功能,可以帮助开发者快速搭建现代化的后台管理系统。 一、基本知识 (一)Vue-element-admin 的主要文件和目录 vue-element-admin/ |--…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...
关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148515355 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
Android多媒体——音/视频数据播放(十八)
在媒体数据完成解码并准备好之后,播放流程便进入了最终的呈现阶段。为了确保音视频内容能够顺利输出,系统需要首先对相应的播放设备进行初始化。只有在设备初始化成功后,才能真正开始音视频的同步渲染与播放。这一过程不仅影响播放的启动速度,也直接关系到播放的稳定性和用…...
