在.net开发中,通过字节流动态操作excel文件提供了一种高效且灵活的方式处理数据。这种方法允许开发者直接在内存中创建、修改和保存excel文档,无需依赖直接的文件储存、读取操作,从而提高了程序的性能和安全性。使用流技术处理excel不仅简化了数据操作流程,还支持更简便的并发处理和临时数据管理,使应用程序能够更好地适应各种数据处理需求。本文将演示如何在.net平台使用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];
// 创建并填充一个包含示例数据的 datatable
datatable 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文件的文章就介绍到这了,更多相关c#字节流动态操作excel内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论