.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/ |--…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
