自学内容网 自学内容网

.NET平台用C#通过字节流动态操作Excel文件

在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据。这种方法允许开发者直接在内存中创建、修改和保存Excel文档,无需依赖直接的文件储存、读取操作,从而提高了程序的性能和安全性。使用流技术处理Excel不仅简化了数据操作流程,还支持更简便的并发处理和临时数据管理,使应用程序能够更好地适应各种数据处理需求。本文将演示如何在.NET平台使用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];

            // 创建并填充一个包含示例数据的 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();
        }
    }
}

结果
.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工作簿。


原文地址:https://blog.csdn.net/Eiceblue/article/details/144772712

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!