.NET利用C#字節(jié)流動(dòng)態(tài)操作Excel文件
在.NET開(kāi)發(fā)中,通過(guò)字節(jié)流動(dòng)態(tài)操作Excel文件提供了一種高效且靈活的方式處理數(shù)據(jù)。這種方法允許開(kāi)發(fā)者直接在內(nèi)存中創(chuàng)建、修改和保存Excel文檔,無(wú)需依賴直接的文件儲(chǔ)存、讀取操作,從而提高了程序的性能和安全性。使用流技術(shù)處理Excel不僅簡(jiǎn)化了數(shù)據(jù)操作流程,還支持更簡(jiǎn)便的并發(fā)處理和臨時(shí)數(shù)據(jù)管理,使應(yīng)用程序能夠更好地適應(yīng)各種數(shù)據(jù)處理需求。本文將演示如何在.NET平臺(tái)使用C#通過(guò)字節(jié)流創(chuàng)建、讀取、編輯及保存Excel文件。
本文所使用的方法需要用到免費(fèi)的Free Spire.XLS for .NET,NuGet:Install-Package FreeSpire.XLS。
用C#創(chuàng)建并保存Excel工作簿為字節(jié)流
我們可以通過(guò)創(chuàng)建Workbook實(shí)例直接創(chuàng)建Excel工作簿,然后在其中添加數(shù)據(jù)及設(shè)置格式,最后使用Workbook.SaveToStream()方法將其保存為字節(jié)流。注意新建的Excel工作簿包含三個(gè)默認(rèn)的工作表。以下是操作步驟示例:
創(chuàng)建Workbook實(shí)例。
通過(guò)Workbook.Worksheets[]屬性訪問(wèn)工作簿。
定義或讀取用于制作表格數(shù)據(jù),如使用DataTable創(chuàng)建一個(gè)數(shù)據(jù)表。
使用Workbook.InsertDataTable()插入數(shù)據(jù)到工作表中,或通過(guò)Worksheet.Range[].Value屬性直接為單元格添加數(shù)據(jù)。
通過(guò)CellRange.Style中的屬性為單元格設(shè)置格式。
使用Worksheet.AutoFitColumn()方法自動(dòng)調(diào)整列寬。
使用Workbook.SaveToStream()方法將Excel工作簿保存到新建的字節(jié)流或已有的字節(jié)流。
代碼示例
using Spire.Xls;
using System.Data;
using System.Drawing;
namespace CreateExcelStream
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建一個(gè)新的工作簿實(shí)例
Workbook workbook = new Workbook();
// 獲取工作簿中的第一個(gè)工作表
Worksheet sheet = workbook.Worksheets[0];
// 創(chuàng)建并填充一個(gè)包含示例數(shù)據(jù)的 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, "張偉", "男", "軟件工程師", "研發(fā)部", 75000, DateTime.Parse("2020-03-15"));
table.Rows.Add(2, "李娜", "女", "項(xiàng)目經(jīng)理", "項(xiàng)目管理辦公室", 85000, DateTime.Parse("2019-06-22"));
table.Rows.Add(3, "王芳", "女", "用戶體驗(yàn)設(shè)計(jì)師", "設(shè)計(jì)部", 70000, DateTime.Parse("2021-04-05"));
table.Rows.Add(4, "趙強(qiáng)", "男", "系統(tǒng)分析師", "信息技術(shù)部", 80000, DateTime.Parse("2018-07-11"));
table.Rows.Add(5, "孫麗", "女", "市場(chǎng)營(yíng)銷專員", "市場(chǎng)部", 60000, DateTime.Parse("2022-01-03"));
table.Rows.Add(6, "周勇", "男", "銷售代表", "銷售部", 65000, DateTime.Parse("2020-09-10"));
table.Rows.Add(7, "吳敏", "女", "財(cái)務(wù)會(huì)計(jì)", "財(cái)務(wù)部", 72000, DateTime.Parse("2017-11-28"));
table.Rows.Add(8, "鄭濤", "男", "人力資源經(jīng)理", "人力資源部", 82000, DateTime.Parse("2016-05-18"));
table.Rows.Add(9, "馮靜", "女", "法律顧問(wèn)", "法務(wù)部", 90000, DateTime.Parse("2015-02-14"));
table.Rows.Add(10, "陳浩", "男", "首席執(zhí)行官", "高層管理", 120000, DateTime.Parse("2014-08-01"));
// 將 DataTable 中的數(shù)據(jù)插入到工作表中
sheet.InsertDataTable(table, true, 1, 1);
// 格式化工作表
// 設(shè)置表頭行的樣式
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); // 設(shè)置邊框顏色
// 設(shè)置數(shù)據(jù)行的樣式
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;
// 更改偶數(shù)行背景色
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(); // 添加數(shù)據(jù)行單元格內(nèi)邊框
sheet.Range[2, 1, sheet.Rows.Count(), sheet.Columns.Count()].Borders.Color = Color.FromArgb(220, 220, 220); // 設(shè)置邊框顏色
// 調(diào)整列寬以適應(yīng)內(nèi)容
for (int j = 1; j <= sheet.AllocatedRange.Columns.Count(); j++)
{
sheet.AutoFitColumn(j);
}
// 將工作簿保存到內(nèi)存流
MemoryStream stream = new MemoryStream();
workbook.SaveToStream(stream, FileFormat.Version2016);
// 將流內(nèi)容寫入到文件
File.WriteAllBytes("output/通過(guò)流創(chuàng)建Excel文件.xlsx", stream.ToArray());
// 釋放資源
workbook.Dispose();
}
}
}
結(jié)果

用C#通過(guò)字節(jié)流直接讀取Excel文件數(shù)據(jù)
我們可以使用Workbook.LoadFromStream()將Excel文件流載入到Workbook實(shí)例,然后使用Workbook.Worksheets[]屬性訪問(wèn)工作表以及Worksheet.Range[].Value屬性訪問(wèn)單元格數(shù)據(jù),從而直接讀取其數(shù)據(jù)用于進(jìn)行進(jìn)一步操作。以下是操作步驟示例:
創(chuàng)建Workbook實(shí)例。
使用Workbook.LoadFromStream()方法從新建的字節(jié)流或已有的字節(jié)流載入Excel工作簿。
通過(guò)Workbook.Worksheets[]屬性訪問(wèn)指定工作表。
遍歷工作表已使用的單元格范圍的行和列,通過(guò)Worksheet.Range[].Value屬性獲取單元格數(shù)據(jù)。
輸出獲取到的數(shù)據(jù),或?qū)?shù)據(jù)用于其他操作。
代碼示例
using Spire.Xls;
namespace LoadExcelStream
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建一個(gè) Workbook 類的實(shí)例
Workbook workbook = new Workbook();
// 創(chuàng)建一個(gè)內(nèi)存流
MemoryStream stream = new MemoryStream();
File.OpenRead("output/通過(guò)流創(chuàng)建Excel文件.xlsx").CopyTo(stream);
// 從內(nèi)存流加載 Excel 文件
workbook.LoadFromStream(stream);
// 獲取工作簿中的第一個(gè)工作表
Worksheet sheet = workbook.Worksheets[0];
// 初始化一個(gè)列表,用于存儲(chǔ)從工作表中提取的數(shù)據(jù)
List<List<string>> data = new List<List<string>>();
for (int i = 0; i < sheet.AllocatedRange.Rows.Count(); i++)
{
// 創(chuàng)建一個(gè)列表來(lái)存儲(chǔ)每行數(shù)據(jù)
List<string> lines = new List<string>();
for (int j = 0; j < sheet.AllocatedRange.Columns.Count(); j++)
{
// 獲取單元格的值并添加到當(dāng)前行的列表中
lines.Add(sheet.AllocatedRange[i + 1, j + 1].Value);
}
// 將當(dāng)前行的數(shù)據(jù)添加到數(shù)據(jù)列表中
data.Add(lines);
}
// 打印提取的數(shù)據(jù),或?qū)⑵溆糜诤罄m(xù)操作
foreach (List<string> lines in data)
{
Console.WriteLine(string.Join(" | ", lines));
}
}
}
}
結(jié)果

用C#通過(guò)字節(jié)流編輯Excel工作簿
通過(guò)使用Workbook的LoadFromStream方法,我們可以從字節(jié)流載入Excel工作簿,然后再使用庫(kù)中的其他方法和屬性對(duì)工作簿內(nèi)容進(jìn)行編輯。在完成編輯后,再使用SaveToStream方法將工作簿保存回字節(jié)流,就可以實(shí)現(xiàn)只通過(guò)字節(jié)流對(duì)Excel文件進(jìn)行編輯操作。以下是操作步驟示例:
創(chuàng)建Workbook實(shí)例。
使用Workbook.LoadFromStream()方法從新建的字節(jié)流或已有的字節(jié)流載入Excel工作簿。
通過(guò)Workbook.Worksheets[]屬性訪問(wèn)指定工作表。
通過(guò)CellRange的Style、Value等屬性對(duì)單元格或單元格范圍進(jìn)行編輯。
使用使用Workbook.SaveToStream()方法將Excel工作簿保存回字節(jié)流。
釋放資源。
代碼示例
using Spire.Xls;
using System.Drawing;
namespace ModifyExcelStream
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建 Workbook 類的一個(gè)新實(shí)例
Workbook workbook = new Workbook();
// 創(chuàng)建一個(gè)內(nèi)存流
MemoryStream stream = new MemoryStream();
File.OpenRead("output/通過(guò)流創(chuàng)建Excel文件.xlsx").CopyTo(stream);
// 從內(nèi)存流加載 Excel 文件
workbook.LoadFromStream(stream);
// 獲取工作簿中的第一個(gè)工作表
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);
// 修改數(shù)據(jù)行的樣式
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);
// 更改著色(偶數(shù)行)
if (i % 2 == 0)
{
dataRow.Style.Color = Color.FromArgb(129, 222, 227);
}
}
// 自動(dòng)調(diào)整列寬以適應(yīng)內(nèi)容
for (int k = 1; k <= sheet.AllocatedRange.Columns.Count(); k++)
{
sheet.AutoFitColumn(k);
}
// 修改邊框顏色
sheet.AllocatedRange.Style.Borders.Color = Color.White;
// 將修改后的工作簿保存回內(nèi)存流
workbook.SaveToStream(stream);
// 將流內(nèi)容寫入到一個(gè)新文件
File.WriteAllBytes("output/通過(guò)流修改Excel文件.xlsx", stream.ToArray());
// 釋放資源
workbook.Dispose();
}
}
}
結(jié)果

到此這篇關(guān)于.NET利用C#字節(jié)流動(dòng)態(tài)操作Excel文件的文章就介紹到這了,更多相關(guān)C#字節(jié)流動(dòng)態(tài)操作Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#?TaskScheduler任務(wù)調(diào)度器的實(shí)現(xiàn)
本文主要介紹了C#?TaskScheduler任務(wù)調(diào)度器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>2023-05-05
C#編程實(shí)現(xiàn)簡(jiǎn)易圖片瀏覽器的方法
這篇文章主要介紹了C#編程實(shí)現(xiàn)簡(jiǎn)易圖片瀏覽器的方法,涉及C#基于WinForm操作圖片實(shí)現(xiàn)預(yù)覽功能的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
簡(jiǎn)述C#枚舉高級(jí)戰(zhàn)術(shù)
這篇文章主要介紹了簡(jiǎn)述C#枚舉高級(jí)戰(zhàn)術(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
使用C#的正則表達(dá)式驗(yàn)證中文字符(實(shí)例代碼)
本文通過(guò)實(shí)例代碼給大家介紹了使用C#的正則表達(dá)式驗(yàn)證中文字符的方法,需要的的朋友參考下吧2017-07-07

