.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/ |--…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...