.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工作簿包含三个默认的工作表。以下是操作步骤示例:

  1. 创建Workbook实例。
  2. 通过Workbook.Worksheets[]属性访问工作簿。
  3. 定义或读取用于制作表格数据,如使用DataTable创建一个数据表。
  4. 使用Workbook.InsertDataTable()插入数据到工作表中,或通过Worksheet.Range[].Value属性直接为单元格添加数据。
  5. 通过CellRange.Style中的属性为单元格设置格式。
  6. 使用Worksheet.AutoFitColumn()方法自动调整列宽。
  7. 使用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();}}
}

结果
.NET通过字节流创建Excel文件

用C#通过字节流直接读取Excel文件数据

我们可以使用Workbook.LoadFromStream()将Excel文件流载入到Workbook实例,然后使用Workbook.Worksheets[]属性访问工作表以及Worksheet.Range[].Value属性访问单元格数据,从而直接读取其数据用于进行进一步操作。以下是操作步骤示例:

  1. 创建Workbook实例。
  2. 使用Workbook.LoadFromStream()方法从新建的字节流或已有的字节流载入Excel工作簿。
  3. 通过Workbook.Worksheets[]属性访问指定工作表。
  4. 遍历工作表已使用的单元格范围的行和列,通过Worksheet.Range[].Value属性获取单元格数据。
  5. 输出获取到的数据,或将数据用于其他操作。

代码示例

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文件

用C#通过字节流编辑Excel工作簿

通过使用WorkbookLoadFromStream方法,我们可以从字节流载入Excel工作簿,然后再使用库中的其他方法和属性对工作簿内容进行编辑。在完成编辑后,再使用SaveToStream方法将工作簿保存回字节流,就可以实现只通过字节流对Excel文件进行编辑操作。以下是操作步骤示例:

  1. 创建Workbook实例。
  2. 使用Workbook.LoadFromStream()方法从新建的字节流或已有的字节流载入Excel工作簿。
  3. 通过Workbook.Worksheets[]属性访问指定工作表。
  4. 通过CellRangeStyleValue等属性对单元格或单元格范围进行编辑。
  5. 使用使用Workbook.SaveToStream()方法将Excel工作簿保存回字节流。
  6. 释放资源。

代码示例

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通过字节流编辑Excel文件

本文演示了如何在.NET平台使用C#通过字节流创建、读取、编辑及保存Excel工作簿。

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

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

相关文章

将多个 k8s yaml 配置文件合并为一个文件

如下bash脚本实现功能 “将多个k8s的yaml 配置文件” 合并为一个 yaml&#xff0c;使用 --- 分割文件配置。 创建文件 merge_yaml.sh &#xff0c;内容如下&#xff1a; #!/bin/bash# 默认参数 input_patterns() # 匹配的文件模式数组 output_file"combined.yaml"…

Word论文交叉引用一键上标

Word论文交叉引用一键上标 1.进入Microsoft word使用CtrlH快捷键或单击替换按钮 2.在查找内容中输入[^#] 3.鼠标点击&#xff0c;标签为“替换为&#xff1a;”的文本框&#xff0c;注意光标一定要打在图红色方框圈中的文本框中&#xff01; 4.点击格式选择字体 5.勾选上标…

直流有刷电机多环控制(PID闭环死区和积分分离)

直流有刷电机多环控制 提高部分-第8讲 直流有刷电机多环控制实现(1)_哔哩哔哩_bilibili PID模型 外环的输出作为内环的输入,外环是最主要控制的效果,主要控制电机的位置。改变位置可以改变速度,改变速度是受电流控制。 实验环境 【 !】功能简介: 按下KEY1使能电机,按下…

计算机网络实验室建设方案

一、计算机网络实验室拓扑结构 计算机网络综合实验室解决方案&#xff0c;是面向高校网络相关专业开展教学实训的综合实训基地解决方案。教学实训系统采用 B&#xff0f;S架构&#xff0c;通过公有云教学实训平台在线学习模式&#xff0c;轻松实现网络系统建设与运维技术的教学…

soular使用教程

用 soular 配置你的组织&#xff0c;工作更高效&#xff01;以下是快速上手的简单步骤&#xff1a; &#xfeff; 1. 账号管理 可以对账号信息进行多方面管理&#xff0c;包括分配不同的部门、用户组等&#xff0c;从而确保账号权限和职责的清晰分配。 &#xfeff; 1.1 用…

memory泄露分析方法(Binder,Window,View篇)

View泄露&#xff1a;从Hprof找大量重复的view&#xff0c;点击查看text文案如果相同则找产品他们确认是否合理 window泄露&#xff1a;代码或dumpsys window来监测是否有大量同名window&#xff0c;不能用windowtoken来辨别是否重复window&#xff0c;每个window token都不一样…

FPGA的DMA应用——pcileech

硬件通过pcie总线&#xff0c;访存本机的内存&#xff0c;并进行修改&#xff0c;可以进行很多操作。 学习视频&#xff1a;乱讲DMA及TLP 1-pcileech项目简介和自定义模块介绍_哔哩哔哩_bilibili vivado2024.1的下载文章链接和地址&#xff1a;AMD-Xilinx Vivado™ 2024.1 现…

原点安全再次入选信通院 2024 大数据“星河”案例

近日&#xff0c;中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织开展的 2024 大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动结果正式公布。由工银瑞信基金管理有限公司、北京原点数安科技有限公司联…

操作系统知识点总结

第一章 1.1_1 操作系统的概念、功能和目标 操作系统&#xff08;Operating System, OS&#xff09;&#xff1a;是指控制和管理整个计算机系统的 硬件和软件 资源&#xff0c;并合理地组织调度计算机的工作和资源的分配。 作为用户和计算机硬件之间的接口 提供的功能 命令接口…

Log4j2的Policies详解、SizeBasedTriggeringPolicy、TimeBasedTriggeringPolicy

文章目录 一、Policies二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略2.1、文件达到指定大小就归档 三、TimeBasedTriggeringPolicy&#xff1a;基于时间间隔的滚动策略3.1、验证秒钟归档场景3.2、验证分钟场景3.3、验证小时场景 四、多策略组合使用五、扩展知识5.1、S…

【机器学习与数据挖掘实战】案例06:基于Apriori算法的餐饮企业菜品关联分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数据集中发现模式、关联…

DataCap MongoDB Driver: 全面解析MongoDB在DataCap中的使用指南

在大数据时代&#xff0c;MongoDB作为一款广受欢迎的NoSQL数据库&#xff0c;其灵活的文档存储模型和强大的查询能力使其成为许多现代应用的首选数据存储方案。今天&#xff0c;我们将深入探讨DataCap MongoDB Driver&#xff0c;这是一个强大的工具&#xff0c;它让在DataCap环…

FreeRTOS的调度器挂起和恢复

1. 调度器挂起 vTaskSuspendAll void vTaskSuspendAll( void ) {/* A critical section is not required as the variable is of typeBaseType_t. Please read Richard Barrys reply in the following link to apost in the FreeRTOS support forum before reporting this as…

EleutherAI/pythia-70m

EleutherAI/pythia-70m” 是由 EleutherAI 开发的一个小型开源语言模型&#xff0c;它是 Pythia Scaling Suite 系列中参数量最小的模型&#xff0c;拥有大约 7000 万个参数。这个模型主要旨在促进对语言模型可解释性的研究&#xff1b; Pythia Scaling Suite是为促进可解释性…

蓝牙链路控制(Link Control)命令概览

目录 一、设备发现与连接管理(14条) 1.1. 设备发现 1.2. 连接建立与取消 1.3. 连接接受与拒绝 1.4. 连接断开与维护 二、设备信息查询(9条) 2.1. 基本信息查询 2.2. 安全相关信息交互 三、安全认证与加密(12条) 3.1. 认证请求与回复 3.2. 加密设置 四、同步与…

在国产电脑上运行PDFSAM软件使用pdf分割合并交替混合处理pdf文档

软件下载地址: https://sourceforge.net/projects/pdfsam/files/ 需要注意事项&#xff0c;系统需要java环境&#xff0c;确认系统有java环境&#xff0c;根据软件版本需求安装对应的java运行环境。 下载pdfsam-4.3.4-linux.tar.gz安装包&#xff0c;解压&#xff0c;将runt…

【HENU】河南大学计院2024 计算机网络 期末复习知识点

和光同尘_我的个人主页 一直游到海水变蓝。 计网复习 第一章互联网组成类别交换方式分组交换的要点&#xff1a;分组交换的优点&#xff1a; 网络性能指标体系结构网络协议五层协议 第二章&#xff1a;物理层物理层的主要任务&#xff08;四大特性&#xff09;通信的三种方式…

python网络框架——Django、Tornado、Flask和Twisted

Django、Tornado和flask是全栈网络框架&#xff0c;而Twisted更专注于网络底层的高性能封装&#xff0c;不提供HTML模版引擎等界面功能&#xff0c;因此不能称为全栈框架。 1、Django 发布于2003年&#xff0c;是当前python世界里最负盛名且最成熟的网络框架。相较于其他web框…

C++——运算符重载

一、运算符重载 ①含义 函数重载或函数多态&#xff1a;同名函数完成相同的基本操作 C将重载的概念扩展到运算符上&#xff0c;于是出现了运算符重载 C中有很多运算符已经被重载 *运算符&#xff0c;运用于地址&#xff0c;可以得到存储在这个地址的值&#xff1b;运用于两个…

IPv6的地址类型

IPv6地址总长度为128bit&#xff0c;被分为8组&#xff0c;每组为4个十六进制数&#xff0c;用冒号分隔&#xff1a; 例如&#xff1a;FC00:0123:4567:8901:ABFD:0987:0000:0023 可缩写为&#xff1a;FC00:0123:4567:8901:ABFD:0987::23 IPv6中取消了v4中的广播&#xff0c;新…